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”传递,而不是实际的类类型。如何修复上述构造函数配置?
答案 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.
类型是通过方法调用而不是构造函数传递的。