具有类型定义的构造函数的Setter注入

时间:2010-12-06 17:40:25

标签: dependency-injection types structuremap

我想知道这是否是一件非常简单的事情,我只是错过了,或者还有更多内容。

基本上,我要做的是使用StructureMap的setter注入来实现记录器。我希望StructureMap使用的记录器的构造函数接受Type参数来创建记录器:

public class Logger : ILogger
{
    private ILog _log = null;

    public Logger() { _log = LogManager.GetCurrentClassLogger(); }

    public Logger(string name) { _log = LogManager.GetLogger(name); }

    public Logger(Type loggerType) { _log = LogManager.GetLogger(loggerType); }

    // The rest of the implementation...
}

在我的引导代码中,我将其初始化为:

ObjectFactory.Configure(x => {
    x.FillAllPropertiesOfType<ILogger>().Use(l =>
        new Logger(l.BuildStack.Current.ConcreteType));
    // Further unrelated bootstrapping...
});

它不是100%完全正常工作,而我可能只是缺乏充分理解。所以我对我所看到的行为有几个问题:

  1. 当我逐步调试调试器并深入查看log4net实现时,记录器看到的“类型”为ILogger。我怎样才能使它成为包含被注入的setter的类型?
  2. 仅设置StructureMap构建的实例上的setter。例如,在数据访问层的存储库接口/实现上。其他对象(例如我的业务模型)不是从StructureMap图构建的,只是像往常一样实例化。有没有办法告诉StructureMap还注入那些?我想有没有,因为它会怎么知道?那么我该如何解决该类型的正确构造的记录器的实例呢? (我知道如何调用解析器,我通过服务定位器调用,而不是如何根据此特定需求调用它。)
  3. 我觉得这“感觉不对劲”。也许我错过了一些关于命名实例的东西?因为如果引导程序设法绘制了这个实现的图形,那么它将如何/何时为每个具有setter的类提供不同的实例?
  4. 也许有一种完全不同/更简单/更好的方式来完成我想要做的事情,我欢迎这方面的建议。基本上,我在IoC容器后面抽象我的日志记录实现,我需要特定于类的记录器。

1 个答案:

答案 0 :(得分:1)

也许这不是您正在寻找的确切答案,但为什么不通过创建ILoggerFactory来简化所有内容?您可以注册ILogger并在您的课程中注入ILoggerFactory,而不是注册ILoggerFactory

public interface ILoggerFactory
{
    ILogger CreateFor(string name);
    ILogger CreateFor<T>();
    ILogger CreateFor(Type loggerType);
}

public class LoggerFactory : ILoggerFactory
{
    public ILogger CreateFor(string name)
    {
        return LogManager.GetLogger(name);
    }

    public ILogger CreateFor<T>()
    {
        return CreateFor(typeof(T));
    }

    public ILogger CreateFor(Type loggerType)
    {
        return LogManager.GetLogger(loggerType);
    }
}