我最近从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>();
});发布于 2017-01-12 09:21:07
看起来你对IsAssignableFrom的使用是颠倒过来的。
您应该使用typeof(IModelMetadataFilter).IsAssignableFrom(t)或Autofac提供的扩展方法t.IsAssignableTo<IModelMetadataFilter>(),后者更易于阅读。
https://stackoverflow.com/questions/41597332
复制相似问题