1

在 Tiny IOC 中,如何获得要解决的类型。例如日志记录:

    container.Register<ILogger>((c, p) =>
                                        {
                                            return LoggerFactory.CreateLog(typeofCALLER);
                                        });

我正在尝试添加工厂来构建 ILogger,但没有注入信息。

4

2 回答 2

2

在这种情况下,简单地使用 TinyIoC 的开放泛型功能可能就足够了。

public class Consumer
{
    public Consumer(ILogger<Consumer> logger) {}
}

public interface ILogger<T>
{
    string Log(string message);
}

public class ConcreteLogger<T>:ILogger<T>
{
    public string Log(string message)
    {
        return string.Format("{0}: {1}", typeof (T), message);
    }
}

然后做

container.Register(typeof (ILogger<>), typeof (ConcreteLogger<>));

这将导致一个实例ConcreteLogger<Consumer>被注入到Consumer构造函数中。

编辑

如果您需要ILogger参考,您可以只制作ILogger<T>一个“标记界面”并让它“派生”自ILogger

public interface ILogger<T> : ILogger
{
}

该类Consumer仍然需要依赖于ILogger<Consumer>,但ConcreteLogger<T>会直接实现ILogger成员。

我认为没有更好的方法,特别是如果ILogger接口是固定的,因为它不是你自己的。我认为没有办法向 TinyIoC 询问它当前尝试解析的类型然后能够对其采取行动,因此如果您需要特定于类型的实现,则必须通过其他方式知道类型 - 和泛型通常(并非总是)对此有所帮助。

于 2013-03-14T16:08:09.007 回答
1

注意:我ILog在我的示例中使用,这就是 log4net 所称的特定于类型的记录器类。但它的创建和使用方式似乎与您示例中的 ILogger 完全相同,并且 log4net 类似于LogManager.GetLog(Type t)您的LoggerFactory.CreateLog(typeofCALLER).

这需要做更多的工作,但您可以创建一个通用工厂类来生成特定类型的记录器。将此工厂类注入到构造函数中,而不是Ilog.

TinyIoC 的注册 API 不允许您指定一个知道当前解析类型正在注入的包含类型的工厂。以下解决方法有效,因为 TinyIoC 注入了 or 的正确通用实例LogFactory<Foo>LogFactory<Bar>然后我们捕获了由 .ILog返回的正确生成的实例logFactory.Get()。与我们使用 autofac 相比,需要额外的一些击键——它确实支持你所追求的——但它们不需要太多思考。

假设你想做一些登录类Foo,并且Bar. 您LogFactory<T>只需定义一次,并在 Foo、Bar 和任何其他需要使用特定于类型的 ILog 实例进行日志记录的类中使用它:

public class LogFactory<T> {
    public LogFactory() {} //empty
    public ILog Get() { return LogManager.GetLogger(typeof(T)); }
}

public class Foo {
    private readonly ILog _log; 

    public Foo(LogFactory<Foo> logFactory, ...) {
        _log = logFactory.Get();
    }
}

public class Bar{
    private readonly ILog _log; 

    public Bar(LogFactory<Bar> logFactory, ...) {
        _log = logFactory.Get();
    }
}
于 2015-03-20T08:06:34.610 回答