Единство и делегат - PullRequest
       22

Единство и делегат

3 голосов
/ 02 октября 2009

Я использую инфраструктуру внедрения зависимостей Unity. У меня есть два класса, каждый из которых принимает один и тот же параметр делегата в конструкторе. Каждый класс должен получить свой метод при разрешении. Могу ли я установить это без использования атрибутов? Если нет, то как бы вы сделали это с атрибутами?

Ответы [ 2 ]

3 голосов
/ 02 октября 2009

Да, вы можете декорировать свойства или параметры конструктора с помощью атрибута [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 голосов
/ 02 октября 2009

Вместо этого вы можете попробовать передать фабрику в конструкторе объектов. Таким образом, вы можете гарантировать (и протестировать) в коде, какие именно объекты создаются.

...