基于委托的构造函数参数

时间:2013-11-08 17:38:19

标签: .net dependency-injection unity-container

我有一个案例,我需要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处理,但这只是琐事 - 与回答此问题无关。

0 个答案:

没有答案