0

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”而不是实际的类类型传递。如何修复上述构造函数配置?

4

2 回答 2

1

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

于 2012-04-12T19:06:54.513 回答
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.

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

于 2012-04-12T19:17:59.380 回答