Единство иерархической инъекции - PullRequest
1 голос
/ 24 мая 2011

Помогите мне решить следующую задачу: У меня есть интерфейс IRepository, который в качестве примера определяет свойство Context:

interface IRepository
{
   IContext Context { get; set; }
}

interface IOne : IRepository
{
}

interface ITwo : IRepository
{
}

Свойство Context в реализации имеет DependencyAttribyte, и вся реализация зарегистрирована как в следующем примере:

container.RegisterType<IOne, One>();
container.RegisterType<ITwo, Two>();
container.RegisterType<IContext, Context>();

Я хочу разрешить реализацию "Два" из реализации "Один" с наследованием значения свойства "Контекст";

в качестве образца:

public class One : IOne
{
   [Dependency]
   public IContext Context { get; set; }

   [Dependency]
   public IUnityContainer Container { get; set; }

   public void Test1()
   {
       Context = new Context();
       var two = Container.Resolve<ITwo>();

       // I want that these values would been equal
       Assert.AreEqual(Context, two.Context);
   }
}

Если вы сможете показать другой способ разрешения реализаций с наследованием значений, это было бы здорово.

Ответы [ 2 ]

1 голос
/ 25 мая 2011

Вы можете использовать PerResolveLifetimeManager.Это действует как временный образ жизни, но экземпляр будет повторно использоваться во всем графе объектов.Однако, чтобы это работало, вам придется заменить вызов container.Resolve на ваш метод Test1.Всегда предпочитайте внедрение конструктора, а не внедрение свойства и не допускайте вызова в контейнер из ваших классов.Этот способ кодирования называется анти-паттерном службы поиска .

1 голос
/ 24 мая 2011

Вы можете зарегистрироваться IContext, используя ContainerControlledLifetimeManager.Таким образом, каждый вызов Resolve<IContext> будет возвращать один и тот же экземпляр.

Другой способ - зарегистрировать экземпляр IContext.

...