Unity和delegate

3

我正在使用Unity依赖注入框架。我有两个类,在构造函数中都需要同一个委托参数。在解析时,每个类应该获取不同的方法。 如果不使用属性,我能否设置这个?如果不能,您会如何使用属性来实现?

2个回答

3

是的,您可以使用[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);
            }
        }
    }

0

相反,您可以尝试在对象的构造函数中传递一个工厂。这样,您可以在代码中保证(并测试)确切创建哪些对象。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接