2016-10-30 24 views
0

IServiceCollectionを使用して、オブジェクトに必要なサービスのリストを作成しています。今私は、オブジェクトをインスタンス化し、DIコンテナがそのオブジェクト.NET CoreのDIコンテナを使用したオブジェクトのインスタンス化

例の依存関係を解決したい、私はの依存性と、タイプSomeObjectのオブジェクトを作成するために、DIコンテナを取得する方法

// In my services config. 
services 
    .AddTransient<IMyService, MyServiceImpl>(); 

// the object I want to create. 
class SomeObject 
{ 
    public SomeObject(IMyService service) 
    { 
     ... 
    } 
} 

注入? (おそらくこれは、それがコントローラに何ですか?)

注:私は

...私はちょうどこのような何かを行うことができるようにしたい、サービスのコレクションで SomeObjectを保存する必要はありません
SomeObject obj = startup.ServiceProvider.Resolve<SomeObject>(); 

...理由:サービスコンテナにすべてのコントローラを追加する必要はありません。そのため、なぜ私はSomeObjectを追加する必要があるのでしょうか?

+0

に動作しますか? – Nkosi

+0

@ NkosiコンソールアプリケーションのMainメソッドで... SomeObject x = startup.ServiceProvider.ResolveDependenciesFor ();のようなものです。 – series0ne

+0

関連する質問:http://stackoverflow.com/questions/31863981/how-to-resolve-instance-inside-configureservices-in-asp-net-core – apk

答えて

2

それは少し荒いですが、これは/あなたがオブジェクトを作成する方法を

public static class ServiceProviderExtensions 
    { 
     public static TResult CreateInstance<TResult>(this IServiceProvider provider) where TResult : class 
     { 
      ConstructorInfo constructor = typeof(TResult).GetConstructors()[0]; 

      if(constructor != null) 
      { 
       object[] args = constructor 
        .GetParameters() 
        .Select(o => o.ParameterType) 
        .Select(o => provider.GetService(o)) 
        .ToArray(); 

       return Activator.CreateInstance(typeof(TResult), args) as TResult; 
      } 

      return null; 
     } 
    } 
+0

どのように 'IServiceProvider'を使用して(すべての依存関係を注入して)オブジェクトをインスタンス化しますか? –

+0

@alexw .Select(o => provider.GetService(o)) – series0ne

+0

@alexw基本的な原則は、1つのコンストラクタがあり、そのパラメータタイプを反復処理し、サービスプロバイダを使用して再構築し、その結果を使用してインスタンスを作成します。 – series0ne

関連する問題