在微型IOC中,如何获取要解析的类型。对于实例日志:
container.Register<ILogger>((c, p) =>
{
return LoggerFactory.CreateLog(typeofCALLER);
});我正在尝试添加一个工厂来构建一个ILogger,但是没有注入信息。
发布于 2013-03-15 00:08:09
在这种情况下,简单地使用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提供它当前正在尝试解析的类型,以便能够对其执行操作,因此,如果您需要特定于类型的实现,则必须通过其他方式了解这些类型-而泛型通常(并不总是)对此很有帮助。
发布于 2015-03-20 16:06:35
注意:我在我的示例中使用了ILog,这就是log4net所称的特定于类型的记录器类。但它的创建和使用方式似乎与示例中的ILogger完全相同,并且log4net的LogManager.GetLog(Type t)类似于您的LoggerFactory.CreateLog(typeofCALLER)。
这需要更多的工作,但是您可以创建一个通用的工厂类来生成特定于类型的记录器。将这个工厂类注入到构造函数中,而不是Ilog中。
TinyIoC的注册API不允许您指定一个工厂,该工厂知道当前解析类型被注入的包含类型。下面的解决方法是可行的,因为TinyIoC注入了正确的LogFactory<Foo>或LogFactory<Bar>的泛型实例,然后我们捕获了由logFactory.Get()返回的正确生成的ILog实例。比我们使用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();
}
}https://stackoverflow.com/questions/14739917
复制相似问题