我正在使用Unity依赖注入框架。我有两个类,在构造函数中都需要同一个委托参数。在解析时,每个类应该获取不同的方法。 如果不使用属性,我能否设置这个?如果不能,您会如何使用属性来实现?
我正在使用Unity依赖注入框架。我有两个类,在构造函数中都需要同一个委托参数。在解析时,每个类应该获取不同的方法。 如果不使用属性,我能否设置这个?如果不能,您会如何使用属性来实现?
是的,您可以使用[Dependency]属性装饰属性或构造函数参数。
这个例子没有使用委托,而是使用接口,但它展示了两个相同接口被注册为不同名称,并且一个类在其构造函数中请求特定的接口:
[TestClass]
public class NamedCI
{
internal interface ITestInterface
{
int GetValue();
}
internal class TestClassOne : ITestInterface
{
public int GetValue()
{
return 1;
}
}
internal class TestClassTwo : ITestInterface
{
public int GetValue()
{
return 2;
}
}
internal class ClassToResolve
{
public int Value { get; private set; }
public ClassToResolve([Dependency("ClassTwo")]ITestInterface testClass)
{
Value = testClass.GetValue();
}
}
[TestMethod]
public void Resolve_NamedCtorDependencyRegisteredLast_InjectsCorrectInstance()
{
using (IUnityContainer container = new UnityContainer())
{
container.RegisterType<ITestInterface, TestClassOne>("ClassOne");
container.RegisterType<ITestInterface, TestClassTwo>("ClassTwo");
container.RegisterType<ClassToResolve>();
var resolvedClass = container.Resolve<ClassToResolve>();
Assert.AreEqual<int>(2, resolvedClass.Value);
}
}
[TestMethod]
public void Resolve_NamedCtorDependencyRegisteredFirst_InjectsCorrectInstance()
{
using (IUnityContainer container = new UnityContainer())
{
container.RegisterType<ITestInterface, TestClassTwo>("ClassTwo");
container.RegisterType<ITestInterface, TestClassOne>("ClassOne");
container.RegisterType<ClassToResolve>();
var resolvedClass = container.Resolve<ClassToResolve>();
Assert.AreEqual<int>(2, resolvedClass.Value);
}
}
}
相反,您可以尝试在对象的构造函数中传递一个工厂。这样,您可以在代码中保证(并测试)确切创建哪些对象。