2017-01-11 5 views
0

Недавно я переключился с Unity на Autofac, и мне трудно получить свои MVC ModelMetadataFilters зависимости для преобразования. Эти фильтры все помечены с интерфейсом IModelMetadataFilter, а затем должны быть введены через застройщик здесь:Регистрация интерфейса Unity/StructureMap

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>(); 
}); 

ответ

1

Выглядит как использование IsAssignableFrom сторнируется.

Вы должны использовать либо typeof(IModelMetadataFilter).IsAssignableFrom(t), либо метод расширения, предусмотренный в Autofac t.IsAssignableTo<IModelMetadataFilter>(), который является более читабельным для человека.

+0

Отлично! Благодарю. –