我有一个案例,我需要 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 容器解决这个问题......
ps 在我的情况下,“日志”属性正在使用记录器自定义 BuildStrategy处理,但这只是琐事 - 与回答这个问题无关。