2016-06-08 207 views
4

我已經創建了通用接口,假設它映射實體以查看模型並向後。我必須在autofac配置中進行大約80次註冊。是否有可能將它們註冊爲批處理? 這裏是接口:如何在autofac中註冊通用接口的所有實現?

public interface ICommonMapper<TEntity, TModel, TKey> 
    where TEntity : BaseEntity<TKey> 
    where TModel : BaseEntityViewModel<TKey> 
    where TKey : struct 
{ 
    TModel MapEntityToModel(TEntity entity); 
    TModel MapEntityToModel(TEntity entity, TModel model); 
    TEntity MapModelToEntity(TModel model); 
    TEntity MapModelToEntity(TModel model, TEntity entity); 
} 

謝謝!

+2

你有80個'ICommonMapper'的實現嗎? –

+0

約80. 117個實體類型...和其中約80個是CRUDable – Roman

回答

17

你可以使用:

builder.RegisterAssemblyTypes(assemblies) 
     .AsClosedTypesOf(typeof(ICommonMapper<,,>)); 

哪裏assemblies是你的類型屬於該集的收集。

,如果你有一個PersonMapperICommonMapper<Person, PersonModel, Int32>繼承,Autofac就能解決ICommonMapper<Person, PersonModel, Int32>

+0

必須提供IAssemblyFinder ...工作的生成器。 – Roman

0

您可以告訴autofac註冊實現接口的所有內容。我不得不從幾個DLL加載很多東西,所以我做了這樣的事情,你應該可以根據自己的需要進行調整:

這裏有一個例子,你應該能夠根據自己的需要進行調整:

foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies()) 
      { 
       if (assembly.FullName.Contains("someNameYouCareAbout")) 
       { 
        builder.RegisterAssemblyTypes(assembly) 
        .AsImplementedInterfaces(); 
       } 
      } 
0

這裏是另一種方式來做到這一點,但與typeFinder的幫助:

var mappers = typeFinder.FindClassesOfType(typeof(ICommonMapper<,,>)).ToList(); 
     foreach (var mapper in mappers) 
     { 
      builder.RegisterType(mapper) 
       .As(mapper.FindInterfaces((type, criteria) => 
       { 
        var isMatch = type.IsGenericType && 
            ((Type)criteria).IsAssignableFrom(type.GetGenericTypeDefinition()); 
        return isMatch; 
       }, typeof(ICommonMapper<,,>))) 
       .InstancePerLifetimeScope(); 
     } 
1

不要需要使其變得複雜,您只需簡單地註冊一個接口的所有實現,如下所示:

enter image description here

然後Autofac會自動注入該接口的實現,當它看到接口的enumerable /數組在這樣的構造函數中。 enter image description here

我使用了這種方法,它的工作原理與我所期望的完全一樣。希望能幫助到你。乾杯

+1

在捕獲對IEnumerator的引用時,代碼中存在內存泄漏,但不要處理它 - 我假設你沒有,因爲你的類沒有實現'IDisposable'。你會不會在乎解釋爲什麼你選擇這種方式,而不是保留'IEnumerable '字段? –

+0

嗨米克,感謝您的評論,我同意我們需要處理這些實例,但這不是我在這裏的答案的焦點。我只想給你們一個例子,說明如何使用Autofac將特定接口的實現數組注入特定實例。爲了不保留一個IEnumerable 字段,因爲我只是想將ICommandChainFeature的實現注入到我的CommandChain類中:) –

+1

我明白了,但爲什麼沒有'private readonly IEnumerable _features;'而不是'IEnumerator ? –

相關問題