2017-01-06 5 views
2

私は新しいWeb APIプロジェクトを作成しています。これで私はこのようなWeb APIをプロジェクトから離れてさらに2つのクラスライブラリプロジェクトを使用しています:ウェブAPIとクラスライブラリの両方でDIを使用する

APIプロジェクトで
MyBlog.API (Web API project) 
MyBlog.Services (Class library)- Contains additional business logic 
MyBlog.Repositories (Class library) - contains all database related operations 

iはサービスプロジェクトの参照を追加し、サービスのプロジェクトで、私はAPIがするので、リポジトリのプロジェクトの参照を追加しました通話サービスおよびサービスは、このようリポジトリを呼び出します:

API > Services > Repositories 

私が直接、彼らがサービスを介して呼び出されます私のAPIコントローラを形成するリポジトリをコールする必要はありません。だから私はAPIプロジェクトでリポジトリプロジェクト参照を追加していません。

私はapiプロジェクトでunity.webapi依存性注入を実装しています。以下は、DIを実装するためのコードです:

リポジトリコード:DI実装と

namespace MyBlogs.Repositories 
{ 
    public interface ITestRepository 
    { 
     string Get(); 
    } 
} 

namespace MyBlogs.Repositories 
{ 
    public class TestRepository:ITestRepository 
    { 
     public string Get() 
     { 
      return "test"; 
     } 
    } 
} 

サービスコード:

namespace MyBlogs.Services 
{ 
    public interface ITestService 
    { 
     string Get(); 
    } 
} 

namespace MyBlogs.Services 
{ 
    public class TestService : ITestService 
    { 
     private ITestRepository testRepository; 

     public TestService(ITestRepository testRepositoryParam) 
     { 
      this.testRepository = testRepositoryParam; 
     } 

     public string Get() 
     { 
      return this.testRepository.Get(); 
     } 
    } 
} 

コントローラーコード:

public class ValuesController : ApiController 
    { 
     private ITestService testService; 
     public ValuesController(ITestService testServiceParam) 
     { 
      this.testService = testServiceParam; 
     } 

     // GET api/values 
     public IEnumerable<string> Get() 
     { 
      return new string[] { this.testService.Get() }; 
     } 
} 

し、最終的にunityconfigファイル:

私はので、どのように私はITestServiceとTestServiceにユニティsimilartにITestRepositoryとTestRepositoryを登録することができ、このunityconfigファイルを持っているAPIプロジェクトのリポジトリプロジェクト参照を追加していないよう
public static class UnityConfig 
    { 
     public static void RegisterComponents() 
     { 
      var container = new UnityContainer(); 
      container.RegisterType<ITestService, TestService>(); 

      GlobalConfiguration.Configuration.DependencyResolver = new UnityDependencyResolver(container); 
     } 
    } 

は、今私は、ここで問題に直面しています?プロジェクト参照を追加せずにリポジトリプロジェクトの依存関係をどこか他の場所に登録する方法はありますか?または私がサービスプロジェクトで単一性を追加しようとしたら、それはどのように登録されますか?

は、私は、Web APIプロジェクトのGlobal.asaxの中unityConfigを登録している:良い質問です

protected void Application_Start() 
     { 
      UnityConfig.RegisterComponents(); 
     } 
+0

mmm私はwebapiプロジェクトまたはコンソールプロジェクトでUnityを呼び出さなければならないと思います。 –

+0

理論上、リポジトリを知っているMyBlogs.Servicesアセンブリ内に別のUnity設定を定義して登録することもできます。 あなたは)(そこリポジトリタイプを登録 MyBlogs.Servicesで別のUnityConfigを作る をリポジトリにWEBAPIからの参照を持っているし、その後 ServicesUnityConfig.RegsiterComponents() UnityConfig.RegisterComponentsないことをやって。 –

+0

@eranotzapそれは良い試してみるよね。ありがとう。 –

答えて

1

と私は団結して、この自分自身を行っていません。 Autofac、WindsorなどのDIを使用すると、各アセンブリからモジュールまたはインストーラを公開し、それらを参照する他のアセンブリからモジュールを読み込むことができます。

だから、私はその考えに基づいて一般的な解決法を提案するつもりです。 (:)これが機能することができます願っています)

public static class WebApiUnityConfig 
{ 
    public static void RegisterComponents() 
    { 
     var container = new UnityContainer(); 
     container.RegisterType<ITestService, TestService>(); 

     GlobalConfiguration.Configuration.DependencyResolver = new UnityDependencyResolver(container); 
    } 
} 


public static class ServicesUnityConfig 
{ 
    public static void RegisterComponents() 
    { 
     var container = new UnityContainer(); 
     container.RegisterType<ITestRepository, TestRepository>(); 

     GlobalConfiguration.Configuration.DependencyResolver = new UnityDependencyResolver(container); 
    } 
} 


protected void Application_Start() 
{ 
    ServiceUnityConfig.RegisterComponents(); 
    WebApiUnityConfig.RegisterComponents(); 
} 
+0

私はそれを試してみる良い見えます。ありがとう。 –

+0

あなたのアイデアに基づいて、私はサービスプロジェクトで1つのファイルを作成し、同じUnityContainerをパラメータとしてサービスのユニティファイルに渡して、APIプロジェクトの単一ファイルからRegisterComponentsメソッドを直接呼び出しました。 次の行がapiプロジェクトの単一性設定で追加されました: \t ServiceUnityConfig.RegisterComponents(container); –

+0

そして次は、サービスの統一の設定ファイルです:パブリック静的クラスServiceUnityConfig { 公共の静的な無効RegisterComponents(UnityContainerコンテナ) { container.RegisterType (); } } それは私の問題を解決しました。ありがとう。 –

0

私は、サービスの統一ファイルへのパラメータとして同じUnityContainerを渡すことで、APIプロジェクトの統一ファイルから直接サービスプロジェクトで団結ファイルを作成することによって、それを解決し、そのRegisterComponents法と呼ばこのように:

public static class UnityConfig 
{ 
    public static void RegisterComponents() 
    { 
    var container = new UnityContainer(); 

     container.RegisterType<ITestService, TestService>(); 
     ServiceUnityConfig.RegisterComponents(container); 

     GlobalConfiguration.Configuration.DependencyResolver = new UnityDependencyResolver(container); 
    } 
} 

public static class ServiceUnityConfig 
{ 
    public static void RegisterComponents(UnityContainer container) 
    { 
     container.RegisterType<ITestRepository, TestRepository>(); 
    } 
} 

それはapp_startに団結を2回登録せずに私の問題を解決しました。上の答えに基づいて、上記のような答えをありがとう、私はこのように実装しました。

関連する問題