团结和代表

时间:2009-10-02 08:42:45

标签: c# dependency-injection unity-container delegates

我正在使用Unity依赖注入框架。 我有两个类,每个类在构造函数中使用相同的delegate参数。解决后,每个类都应该获得不同的方法。 我可以不使用属性进行设置吗?如果不是,你会怎么做属性?

2 个答案:

答案 0 :(得分: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);
            }
        }
    }

答案 1 :(得分:0)

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