在Unity Container中为InjectionConstructor配置参数化构造函数

时间:2012-04-12 18:47:14

标签: c# asp.net dependency-injection inversion-of-control unity-container

LogUtil构造函数如下所示:

    public LogUtil(object classType) 
    {

        ....
    }

我的以下代码正常运行..

var container = new UnityContainer();
container.RegisterType<ILogUtility, LogUtil>(new InjectionConstructor(this.GetType()));
Logger logger = container.Resolve<Logger>();

我在配置文件中配置构造函数设置时遇到问题。 我按如下方式配置了容器注册:

  <container>
    <register type="ILogUtility, Framework"
              mapTo="LogUtil, Log4Net">

        <constructor>
          <param name="classType" type="object">
          </param>
        </constructor>

    </register>
  </container>

上述配置中的构造函数设置似乎存在问题。我无法正确传递“类型”信息。它作为“System.Object”传递,而不是实际的类类型。如何修复上述构造函数配置?

2 个答案:

答案 0 :(得分:1)

我不相信你可以通过配置来做到这一点。这更像是静态设置,您需要运行时反射。但是,LogUtil中的对象应该可以转换回其父类型。您可以尝试的一件事是创建一个ILoggableObject接口,您可以将参数设置为该接口。也就是说,如果您正在寻找可在所有控件上使用的方法/属性

答案 1 :(得分:1)

就个人而言,我不会使用构造函数注入。我会做更像这样的事情:

public static class Log
{
    private static readonly object SyncLock = new object();
    private static ILogFactory _loggerFactory;

    private static void EnsureFactory()
    {
        if (_loggerFactory == null)
        {
            lock (SyncLock)
            {
                if (_loggerFactory == null)
                {
                    _loggerFactory = ServiceLocator.Get<ILogFactory>();
                }
            }
        }
    }

    public static ILogHandler For(object itemThatRequiresLogging)
    {
        if (itemThatRequiresLoggingServices == null)
            throw new ArgumentNullException("itemThatRequiresLogging");

        return For(itemThatRequiresLoggingServices.GetType());
    }

    public static ILogHandler For(Type type)
    {
        if (type == null)
            throw new ArgumentNullException("type");

        EnsureFactory();

        return _loggerFactory.CreateFor(type);
    }

    public static ILogHandler For<T>()
    {
        return For(typeof(T));
    }
}

它将被用作:

Log.For(this).Debug("Some Stuff to log.")); //Debug is defined in ILogHandler.

类型是通过方法调用而不是构造函数传递的。