2017-03-03 11 views
8

.NETコアIOCに組み込まれた標準を使用しています。しかし、私はAutoFacに付属するようないくつかの機能が必要です。私は、このプロジェクトにおける第三者依存の量を制限したい/必要としたい。だから、標準の.NET Core IOCのこのAutoFacメソッドに似たようなことができることを期待していました。.NETコアIOC RegisterAssemblyTypes等価物

builder.RegisterAssemblyTypes(assemblyhere).AsImplementedInterfaces(); 

これは可能ですか?

答えて

0

あなたはおそらく独自の拡張方法を実装してそのようなことを行うことができますが、必要な機能がある場合は、単にAutofacを使用することもできます。あなたはそれに何か理由がありますか?これを行うには、ConfigureServiceshere)のように設定して戻します。

foreach (var implementationType in assemblies.SelectMany(assembly => assembly.GetTypes()).Where(type => !type.GetTypeInfo().IsAbstract)) 
{ 
    foreach(var interfaceType in implementationType.GetInterfaces()) 
    { 
     services.AddSingleton(interfaceType, implementationType); 
    } 
} 

コードがすべて選択されます。あなたは簡単にコードはの線に沿ってだろう...与えられたアセンブリまたはアセンブリの設定のためのすべてのアセンブリの種類を登録するには、独自のメソッドを実装することができ

public IServiceProvider ConfigureServices(IServiceCollection services) 
{ 
    services.AddMvc(); 
    // Add other framework services 

    // Add Autofac 
    var containerBuilder = new ContainerBuilder(); 
    containerBuilder.RegisterModule<DefaultModule>(); 
    containerBuilder.Populate(services); 
    var container = containerBuilder.Build(); 
    return new AutofacServiceProvider(container); 
} 
+0

:それはビルトイン・パッケージ(Scrutor package on Nuget)そのものではないのですけれども

services.Scan(scan => scan .FromAssemblies(typeof(yourassembly).GetTypeInfo().Assembly) .AddClasses() .AsImplementedInterfaces() .WithScopedLifetime()); 

それは、内蔵されたIOCのコンテナに適用されます。私は非MS依存関係なしにアプリケーションを構築しようとしています。しかし、それが可能でないなら、私はオートファックと一緒に行かなければならないと思う。 – leen3o

0

非抽象タイプをassembliesから取得し、それぞれのタイプごとにすべてのインターフェイスを取得して、各インターフェイス/実装のペアに対してSingletonの登録を作成します。私があることのいずれかインスタンスをたい


Iは、明示的なインタフェース(すなわち、ICommandHandlerまたは類似の)のすべてのインスタンスを登録することを好むので、私はいくつかのタイプのために、以下に示すAddCommandHandlersの線に沿って拡張メソッドを追加します登録された... ConfigureServicesservices.AddCommandHandlers(DomainAssembly.Reference);に類似の呼び出しを追加

public static void AddCommandHandlers(this IServiceCollection services, params Assembly[] assemblies) 
{ 
    var serviceType = typeof(ICommandHandler); 

    foreach (var implementationType in assemblies.SelectMany(assembly => assembly.GetTypes()).Where(type => serviceType.IsAssignableFrom(type) && !type.GetTypeInfo().IsAbstract)) 
    { 
     services.AddSingleton(serviceType, implementationType); 
    } 
} 

...

すべての間を登録するので、私は、このアプローチを好みますすべてのタイプの顔は、あなたのIoCコンテナに多くのクルフト登録を追加します。通常、大したことではありませんが、私の意見ではよりクリーンです。

3

はい、Scrutor拡張メソッドを使用して、組み込みの.NET Core IOCコンテナで実行できます。すばらしいアセンブリスキャン機能があります。

はこれを試してみてください:返事をありがとう

+0

'スキャン 'を公開するパッケージは?これが今存在するといいです... –

+0

私の間違いは、Scrutorという名前のパッケージが提供する拡張メソッドのセットです。https://www.nuget.org/packages/Scrutor/ –