2017-03-24 9 views
0

すべてのクラスを解決するためにASP.NET Core DIを構成できますか? Autofac AnyConcreteTypeNotAlreadyRegisteredSource機能と同様のものです。ASP.NETコアは自動的にすべての依存関係を解決します

私はASP.NET CoreでAutofacを使用できますが、ASP.NET Coreには既にDIがあるため、私はアプリケーションにライブラリを追加したくありません。

だから、基本的には代わりに:

services.AddTransient<MyService>(); 
services.AddTransient<MyAnotherService>(); 

私のような何かを行うことを好む:

services.ResolveAll(); 
+1

私はそれができると思うが、それを行う便利な呼び出しがまだありません。私はあなたの特定のユースケースがこのために何であるか興味があります。あなたは何を達成しようとしているのですか?なぜこれをやるのが最善の方法だと思いますか? –

+0

@ErikNorenそれは私が通常DIを使用する方法です。私は愚かなインターフェイスを作成しないことをお勧めします。ですから、実装が1つだけ必要な場合は、インターフェイスとクラスの代わりにクラスを作成します(テストフレームワークまたはDIフレームワークを幸せにする)。ほとんどのプロジェクトでは、いくつかの機能を実現するためにいくつかの実装が必要なわけではありません。だから、 'Foo'クラスを注入したいのであれば、' Foo'クラスだけです。そして私の目標は、DIを設定しないことです。実際に私はこの 'builder.RegisterSource(new AnyConcreteTypeNotAlreadyRegisteredSource());' –

答えて

3

ASP.NETコアDIはサポートされていない自動検出と自動登録し、そこにこれらの機能を追加する予定はありません(少なくとも近い機能では)。

主な理由は、.NET Coreチームが組み込みコンテナをできるだけシンプルに保つことを試み、他のDIコンテナを追加するための簡単な方法です。

関連のSOの質問:Property Injection in Asp.Net Core

0

同じを綴った私は、「プロバイダ」の名前空間上で濾過し、クラス名を探してきた私たちは少し反射

で、この一般的な自動注入の概念を下に開始することができそうです独自の味にはsans "I" が、もちろんシーズンのインタフェース

(このコードはasp.netコア2.0コンテキストで動作します)

var allProviderTypes = System.Reflection.Assembly.GetExecutingAssembly() 
    .GetTypes().Where(t=>t.Namespace != null && t.Namespace.Contains("Providers")); 

    foreach(var intfc in allProviderTypes.Where(t=>t.IsInterface)) { 
    var impl = allProviderTypes.FirstOrDefault(c=>c.IsClass && intfc.Name.Substring(1) == c.Name); 
    if (impl != null) services.AddScoped(intfc, impl); 
    } 
+0

を共有してくれてありがとうございました。 2.0では可能かどうかはチェックしませんが、そうでないように見えます。 –

関連する問題