0

私はアーキテクチャーが新しく、エンドツーエンドのアプリケーションの学習と設計を進めています。私は以下のアーキテクチャを持ち、Autofacを使ってオブジェクトの作成を管理しています。UnitOfWorkのAutoFacオブジェクトの作成を管理する

enter image description here

全てBusinessObject契約はWEBAPIの起動時にセットアップされている、それは実際にすべての私のautofac構成/モジュールを起動することができます唯一のスタートアップです。

私はUnitOfWork/Repositoryパターンを使用しています。ビジネスレイヤーを超えて存在するため、私はWebAPIでUnitOfWorkを参照したくありませんが、UnitOfWorkを起動できません。

私のアーキテクチャ/デザイン/オートファックユニットワークの実装に必要なものを教えてください。

+1

あなたはドライバプロジェクト上のすべての直接の参照を持つべきです(それ以外の場合は、iocを適用することはできません.1つの場所で存続時間を管理する必要があるからです。 –

+0

@ErkanDemirelご意見ありがとうございます。確かに、それは、リーフィーアーキテクチャー、つまりWeb APIのリポジトリへの参照を持っているわけではないということを理解していますか? – Immortal

+0

[Ioc/DIの可能な複製 - エントリアプリケーションですべてのレイヤー/アセンブリを参照する必要があるのはなぜですか?](http://stackoverflow.com/questions/9501604/ioc-di-why-do-i-have-to -refference-all-layers-assemblies-in-entry-application) –

答えて

1

App_startでは、Webプロジェクト固有の依存関係(コントローラなど)を登録します。 、作業単位を登録BL層の静的メソッドを持っているリポジトリなど、すべてのWebの依存関係は、以下のように登録されているときにApp_startに、この静的メソッドを呼び出します。

//App_Start (web project) 
var builder = new ContainerBuilder(); 
var config = GlobalConfiguration.Configuration; 
MyProject.BusinessLayer.RegisterDependancies.Register(builder); <-- Register Unit of Work here in static BL method 
builder.RegisterControllers(typeof(MvcApplication).Assembly); 
builder.RegisterApiControllers(typeof(MvcApplication).Assembly); 
builder.RegisterModule<AutofacWebTypesModule>(); 
builder.RegisterWebApiFilterProvider(config); 
builder.RegisterModule(new AutofacModules.AutoMapperModule()); 
builder.RegisterModule(new AutofacModules.Log4NetModule()); 

var container = builder.Build(); 

DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); 
config.DependencyResolver = new AutofacWebApiDependencyResolver(container); 


//Static method in BL 
namespace MyProject.BusinessLayer 
{ 
    public static class RegisterDependancies 
    { 
     public static void Register(ContainerBuilder builder) 
     { 
      builder.RegisterType<MyContext>().As<IDataContextAsync>().InstancePerLifetimeScope(); 
      builder.RegisterType<UnitOfWork>().As<IUnitOfWorkAsync>().InstancePerLifetimeScope(); 
      builder.RegisterGeneric(typeof(Repository<>)).As(typeof(IRepositoryAsync<>)).InstancePerLifetimeScope(); 
      builder.RegisterAssemblyTypes(typeof(BusinessService).Assembly).Where(t => t.Name.EndsWith("Service")).AsImplementedInterfaces().InstancePerLifetimeScope(); 
     } 
    } 
} 
+0

あなたは絶対伝説です:) – Immortal

+0

@immortalこれはあなたが望むものですが、これはIoCロジックを全く殺していません。 –

+0

@ErkanDemirel私は今のところ良い方法がありません。あなたが示唆することができない限り。 – Immortal

関連する問題