首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TinyIOC构造函数注入

TinyIOC构造函数注入
EN

Stack Overflow用户
提问于 2013-02-07 06:15:09
回答 2查看 1.1K关注 0票数 1

在微型IOC中,如何获取要解析的类型。对于实例日志:

代码语言:javascript
复制
    container.Register<ILogger>((c, p) =>
                                        {
                                            return LoggerFactory.CreateLog(typeofCALLER);
                                        });

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

EN

回答 2

Stack Overflow用户

发布于 2013-03-15 00:08:09

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

代码语言:javascript
复制
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);
    }
}

然后做

代码语言:javascript
复制
container.Register(typeof (ILogger<>), typeof (ConcreteLogger<>));

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

编辑

如果您需要一个ILogger引用,您可以简单地将ILogger<T>设置为“标记接口”,并从ILogger中“派生”它

代码语言:javascript
复制
public interface ILogger<T> : ILogger
{
}

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

我看不到更好的方法,特别是如果ILogger接口是固定的,因为它不是您自己的。我不认为有一种方法可以要求TinyIoC提供它当前正在尝试解析的类型,以便能够对其执行操作,因此,如果您需要特定于类型的实现,则必须通过其他方式了解这些类型-而泛型通常(并不总是)对此很有帮助。

票数 2
EN

Stack Overflow用户

发布于 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更多的几次击键--它确实支持你想要的东西--但它们不需要太多的思考。

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

代码语言:javascript
复制
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();
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14739917

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档