【问题标题】:"Reverse-Resolution" with an Ioc Container?带有 Ioc 容器的“反向解析”?
【发布时间】:2013-10-26 00:09:35
【问题描述】:

我想注册一个类并让 IOC 容器隐式注册与该类关联的接口,而不是注册接口到类的绑定。我想知道是否有任何 IOC 容器可以做到这一点,尽管我特别需要 Unity 的答案。

为了明确我的目的,请注意:

public interface IFred
{
    int Go();
}
public class Fred : IFred
{
    public int Go()
    {
        return 1;
    }
}

class Program
{
    static void Main(string[] args)
    {
        UnityContainer container = new UnityContainer();

        container.RegisterType<Fred>();     //contra-variant registration?
        IFred foo = container.Resolve<IFred>();  //variant resolution?
    }
}

在上面的示例中,我希望返回一个“Fred”实例,即使我没有显式注册 IFred 映射。

【问题讨论】:

  • +1 表示“反变量注册”,呵呵 :) ... 如果 Fred 实现 IFredIDisposableIEquatable&lt;IFred&gt; 会发生什么?
  • @Jeff:大概 IOC 容器按照默认规则运行,例如“如果只有一个接口则成功”或用户定义的规则,例如“选择与给定命名空间模式匹配的接口”。
  • 知道了,我不知道您是否正在考虑围绕 Unity 或其他东西编写便利/包装方法。
  • 您是否明确Fred 上实现IFred?不会有容器可以自动让您为您猜测接口。另一方面,有些容器允许您根据约定注册类型。例如,Castle Windows 允许您注册“程序集中的所有类作为服务第一个接口”(example)。然而,“第一个接口”是什么是未定义的。所以你宁愿不实现多个接口。
  • @Steven:我的错。不敢相信我没有注意到那个错误。固定。

标签: .net dependency-injection ioc-container


【解决方案1】:

我认识一对(虽然很抱歉,但不是 Unity

Autofac:

ContainerBuilder builder = new ContainerBuilder();
builder
    .RegisterType<Fred>()
    .AsImplementedInterfaces();

和温莎城堡:

WindsorContainer container = new WindsorContainer();
container.Register(
    Classes
        .From(typeof(Fred))
        .Pick()
        .LifestyleTransient()
        .WithServiceAllInterfaces());

【讨论】:

猜你喜欢
  • 2014-08-07
  • 1970-01-01
  • 2018-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-01
  • 1970-01-01
  • 2015-07-11
相关资源
最近更新 更多