将具有特定值的字符串参数注入所有类型

时间:2017-07-28 14:39:46

标签: c# inversion-of-control unity-container

鉴于

interface IFoo ...
class MyClass1 : IFoo
{
    public MyClass1(string id) ...
}

class MyClass2 : IFoo
{
    public MyClass2(string id) ...
}
//new classes will be added

当我解决课程时:

UnityContainer container = ...;
container.Resolve(typeThatImplementsIFoo);

然后我如何设置UnityContainer,以便在解析实现IFoo的任何类时向任何ctor参数"123"注入值"string id"

1 个答案:

答案 0 :(得分:0)

如果你编写一个自定义BuilderStrategy来覆盖你的类的构造函数中的输入参数,你可以这样做。

我写了一个简化测试类。它们与您的课程类似:

    public interface IFoo {}

    public class MyClass : IFoo
    {
        public string Id;

        public MyClass(string id)
        {
            Id = id;
        }
    }

    public class MyClass2 : IFoo
    {
        public string Id;

        public MyClass2(string id)
        {
            Id = id;
        }
    }

它们是自定义BuilderStrategy和自定义UnityContainerExtension

    public class UnityExtension<TInterface> : UnityContainerExtension
    {
        private readonly string _paramName;
        private readonly object _paramValue;

        public UnityExtension(string paramName, object paramValue)
        {
            _paramName = paramName;
            _paramValue = paramValue;
        }

        protected override void Initialize()
        {
            var strategy = new BuildStrategy<TInterface>(_paramName, _paramValue);
            Context.Strategies.Add(strategy, UnityBuildStage.PreCreation);
        }
    }

    public class BuildStrategy<TInterface> : BuilderStrategy
    {
        private readonly string _paramName;
        private readonly object _paramValue;

        public BuildStrategy(string paramName, object paramValue)
        {
            _paramName = paramName;
            _paramValue = paramValue;
        }

        public override void PreBuildUp(IBuilderContext context)
        {
            if (typeof(TInterface).IsAssignableFrom(context.OriginalBuildKey.Type))
            {
                context.AddResolverOverrides(new ParameterOverride(_paramName, _paramValue));
            }
        }
    }

您需要自定义UnityContainerExtension,因为您无法在不反映的情况下访问BuilderStrategy的{​​{1}}集合。

因此您只需将此扩展程序添加到UnityContainer并尝试解析您想要的类型:

UnityContainer