转换Unity/StructureMap接口注册

Convert Unity/StructureMap interface registration

我最近从 Unity 切换到 Autofac,但很难转换我的 MVC ModelMetadataFilters 依赖项。这些过滤器都标有接口 IModelMetadataFilter,然后应该通过此处的构造函数注入:

public ExtensibleModelMetadataProvider(IModelMetadataFilter[] metadataFilters)
{
    _metadataFilters = metadataFilters;
}

我试过下面的代码。 ExtensibleModelMetadataProvider 已注册,但 IModelMetadataFilter 类.

未注册
builder.RegisterType<ExtensibleModelMetadataProvider>()
       .As<ModelMetadataProvider>()
       .InstancePerLifetimeScope();

builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly())
       .Where(t => t.IsAssignableFrom(typeof(IModelMetadataFilter)))
       .AsImplementedInterfaces()
       .InstancePerLifetimeScope();

我的统一代码是:

container.RegisterType<ModelMetadataProvider, ExtensibleModelMetadataProvider>();
container.RegisterTypes(
            AllClasses.FromLoadedAssemblies().Where(type => typeof(IModelMetadataFilter).IsAssignableFrom(type)),
            WithMappings.FromAllInterfaces,
            WithName.TypeName,
            WithLifetime.Transient);

我从下面的 Matt Honeycutt 代码 (StructureMap) 转换而来:

For<ModelMetadataProvider>().Use<ExtensibleModelMetadataProvider>();

Scan(scan =>
{
    scan.TheCallingAssembly();
    scan.AddAllTypesOf<IModelMetadataFilter>();
});

您对 IsAssignableFrom 的使用似乎被颠倒了。

您应该使用 typeof(IModelMetadataFilter).IsAssignableFrom(t) 或 Autofac-provided 扩展方法 t.IsAssignableTo<IModelMetadataFilter>(),后者更易于阅读。