【问题标题】:Configure Unity Injection for all descendants of some base class为某个基类的所有后代配置 Unity 注入
【发布时间】:2010-06-23 02:08:54
【问题描述】:

如何配置 Unity,以便从某个基类派生的任何类都可以通过为基类定义的注入管道。

public abstract class Base
{
    public IDependency Dependency {get;set;}
};

public class Derived1: Base
{
};

public class Derived2: Base
{
};


container.RegisterType<Base>(new InjectionProperty("Dependency", new ResolvedParameter<IDependency>()));
var d1 = container.Resolve<Derived1>();

因此,我需要向 Unity 注册基类,同时解析派生类,以便为基类指定的所有注入都应用于派生类。

由于我的项目限制,不允许使用DependencyAttribute 装饰基类属性。


Mirror of the question on Unity's codeplex site

【问题讨论】:

  • 您要查找的内容称为自动注册扫描基于约定的注册。许多 DI 容器(如 Castle Windsor 和 StructureMap)支持这一点,但 Unity 不支持。我可以推荐一个更好的 DI Container 吗?
  • 谢谢,但目前恐怕无法切换到另一个 DI 框架。实际上,我正在寻找智能 BuildUp 而不是我所有后代的自动注册。当然,自动注册也可以让我实现我的目标。但我认为将继承考虑在内是更合适的行为。
  • 也许您会发现这个相关问题(及其答案)很有用:stackoverflow.com/questions/1769056/…
  • 谢谢,@Mark。但是,自动注册不是我需要的。我需要为祖先注册的注射才能应用于后代。我根本不想注册后代。此外,可以通过一些专门的注射来注册后代。并且应该应用所有注入(“继承”和“专业”)。

标签: inheritance dependency-injection unity-container


【解决方案1】:
var container = new UnityContainer();
container
    .RegisterType<IDependency, Dependency1>()
    .RegisterTypes(
        AllClasses
            .FromAssemblies(Assembly.GetExecutingAssembly())
            .Where(t => typeof(Base).IsAssignableFrom(t)),
        getInjectionMembers: _ => new[] { new InjectionProperty("Dependency") });
var d1 = container.Resolve<Derived1>();

注意:您需要支持 Registration by convention 的 Unity 3。

【讨论】:

  • 我在 2010 年就梦想着这个 :)
猜你喜欢
  • 2012-06-26
  • 2017-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-01
相关资源
最近更新 更多