我有一个案例,我需要Unity在“解析”期间而不是在注册期间捕获构造函数值。请注意此扩展名:
public class DataAccessRegistry : UnityContainerExtension, IDataAccessConfig
{
[ThreadStatic]
static string connection = "";
protected override void Initialize()
{
Container.RegisterType<DataAccess>(
new InjectionProperty("log"),
new InjectionConstructor(connection));
}
public IDataAccessConfig WithConnection(string connectionString)
{
connection = connectionString;
return this;
}
}
此示例代码无法正常运行,因为InjectionConstructor(connection)
正在对注册期间包含的connection
变量进行快照。相反,我需要每个执行线程都有机会通过connection
方法更改WithConnection
变量,并让后续解析的DataAccess实例正确包含当前connection
值。
不知何故,需要将委托投入到混合中以使其工作。所以我尝试将RegisterType<DataAccess>()
更改为如下所示:
Container.RegisterType<DataAccess>(
new InjectionProperty("log"), //custom BuildStrategy again.
new InjectionFactory(c =>
{
var dao = new DataAccess(connection);
c.BuildUp(dao); //Try to make custom BuildStrategy apply.
return dao;
}));
委托完成了它的工作并修复了问题,但现在InjectionProperty("log")
无效,因为它被忽略了。当Unity看到InjectionFactory
时,它会忽略InjectionProperty
。
所以现在我认为解决方案是拥有一个代理人的自定义InjectionParameter
。但我想知道如果没有这样的定制,是否有另一种方法可以做到这一点。
我正在使用Unity 2.1,但如果有助于解决此问题则可以升级。我也很好奇如何通过其他.net IOC容器解决这个问题......
P.S。在我的情况下,“log”属性正在使用logger custom BuildStrategy处理,但这只是琐事 - 与回答此问题无关。