鉴于
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"
?
答案 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