【问题标题】:AutoFac Autowiring ConventionsAutoFac 自动装配约定
【发布时间】:2010-12-10 05:00:42
【问题描述】:

StructureMap 能够在扫描时应用约定。因此 IFoo => Foo,没有显式注册。

AutoFac 中是否有类似的功能?环顾四周,找不到任何有用的东西。

谢谢,

【问题讨论】:

  • 您能稍微扩展一下“自动装配”的含义吗?
  • 嗯.. 你的意思是说 StructureMap 在解析 IFoo 时会自动查找名为 Foo 的类吗?

标签: inversion-of-control ioc-container autofac


【解决方案1】:

适用于 v2 的 Autofac 版本

Autofac2 中的新scanning features 将消除一些按惯例注册的需要。假设Foo 位于 Plugins.dll 中:

var assembly = Assembly.Load("Plugins");
builder.RegisterAssemblyTypes(assembly)
       .AsImplementedInterfaces();

本次注册会提取Foo,注册为IFoo

对于低于 v2 的 Autofac 版本

您可以使用 ContainerBuilder.RegisterTypesMatching。这是一个例子:

var builder = new ContainerBuilder();
builder.RegisterTypesMatching(type => type.IsAssignableFrom(typeof(IFoo)));
var container = builder.Build();

var foo = container.Resolve<Foo>();

【讨论】:

    【解决方案2】:

    Peter,他的意思是 StructureMap 中提供的默认约定扫描。它自动绑定 IX 和 X,其中 X 是实现接口 IX 的类。它的工作原理是这样的:

    public override void Process(Type type, Registry registry)
    {
        if (!type.IsConcrete()) return;
    
        Type pluginType = FindPluginType(type);
        if (pluginType != null && Constructor.HasConstructors(type))
        {
            registry.AddType(pluginType, type);
            ConfigureFamily(registry.For(pluginType));
        }
    }
    
    public virtual Type FindPluginType(Type concreteType)
    {
        string interfaceName = "I" + concreteType.Name;
        Type[] interfaces = concreteType.GetInterfaces();
        return Array.Find(interfaces, t => t.Name == interfaceName);
    }
    

    我也想知道 Autofac 是否支持类似的东西。 StructureMap 允许您定义自己的 IRegistrationConvention。这是约定的一个示例。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-22
    • 2016-04-15
    • 2022-09-30
    • 1970-01-01
    相关资源
    最近更新 更多