首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >转换Unity/结构映射接口注册

转换Unity/结构映射接口注册
EN

Stack Overflow用户
提问于 2017-01-12 01:41:13
回答 1查看 89关注 0票数 0

我最近从Unity切换到Autofac,在转换我的MVC ModelMetadataFilters依赖项时遇到了困难。这些过滤器都用接口IModelMetadataFilter标记,然后应该通过这里的构造器注入:

代码语言:javascript
复制
public ExtensibleModelMetadataProvider(IModelMetadataFilter[] metadataFilters)
{
    _metadataFilters = metadataFilters;
}

我已经尝试了下面的代码。注册了ExtensibleModelMetadataProvider,但没有注册IModelMetadataFilter类。

代码语言:javascript
复制
builder.RegisterType<ExtensibleModelMetadataProvider>()
       .As<ModelMetadataProvider>()
       .InstancePerLifetimeScope();

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

我的统一代码是:

代码语言:javascript
复制
container.RegisterType<ModelMetadataProvider, ExtensibleModelMetadataProvider>();
container.RegisterTypes(
            AllClasses.FromLoadedAssemblies().Where(type => typeof(IModelMetadataFilter).IsAssignableFrom(type)),
            WithMappings.FromAllInterfaces,
            WithName.TypeName,
            WithLifetime.Transient);

我将这个代码从Matt Honeycutt的代码(StructureMap)中转换过来:

代码语言:javascript
复制
For<ModelMetadataProvider>().Use<ExtensibleModelMetadataProvider>();

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

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-12 09:21:07

看起来你对IsAssignableFrom的使用是颠倒过来的。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41597332

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档