Unity分层注入

时间:2011-05-23 20:15:46

标签: inheritance inversion-of-control unity-container

请帮我解决以下目标: 我有一个接口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>();

我想从实现“One”中解析实现“Two”,并继承属性“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 个答案:

答案 0 :(得分:1)

您可以使用ContainerControlledLifetimeManager注册IContext。因此,对Resolve<IContext>的每次调用都将返回相同的实例。

另一种方法是register an instance IContext。

答案 1 :(得分:1)

您可以使用PerResolveLifetimeManager。它只是一种短暂的生活方式,但实例将在对象图中重复使用。但是,要实现此功能,您必须从container.Resolve方法替换Test1的来电。总是更喜欢构造函数注入而不是注入属性,并防止从类中调用容器。这种编码方式称为service locator anti-pattern