转换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>()
,后者更易于阅读。
我最近从 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>()
,后者更易于阅读。