私のコードは Microsoft Unity を参照しますが、すべての DI フレームワークにかなり適用できると確信しています。DI を正しく使用している場合、new BusinessObject(new dataContext) を呼び出す必要はありません。DI 関連付けがすべてを処理します。
Unity によって完全に読み込まれた Model View Presenter Web サイトを実行するために使用するコードを貼り付けるので、私の例は少し長くなります。(完全なソースが必要な場合は、私のブログをチェックして、Assembla SVN サーバーからダウンロードしてください)
コンテナをロードします(私が好むように、または構成を使用してコードにすることができます)
protected void Application_Start(object sender, EventArgs e)
{
Application.GetContainer()
// presenters / controllers are per request
.RegisterType<IEmployeeController, EmployeeController>(new ContextLifetimeManager<IEmployeeController>())
//Data Providers are Per session
.RegisterType<IEmployeeDataProvider, EmployeeDataProvider>(new SessionLifetimeManager<IEmployeeDataProvider>())
//Session Factory is life time
.RegisterType<INHibernateSessionManager, NHibernateSessionManager>(new ContainerControlledLifetimeManager());
}
カスタム HTTP モジュールは、OnPreRequest 呼び出し中に各ページの Unity BuildUp メソッドを呼び出します。
private static void OnPreRequestHandlerExecute(object sender, EventArgs e)
{
var handler = HttpContext.Current.Handler;
HttpContext.Current.Application.GetContainer().BuildUp(handler.GetType(), handler);
// User Controls are ready to be built up after the page initialization is complete
var page = HttpContext.Current.Handler as Page;
if (page != null)
{
page.InitComplete += OnPageInitComplete;
}
}
[Dependency] 属性で装飾されたページ コンテナー プレゼンター
public partial class Employees : Page, IEmployeeView
{
private EmployeePresenter _presenter;
[Dependency]
public EmployeePresenter Presenter
{
set
{
_presenter = value;
_presenter.View = this;
}
}
}
InjectionConstructor メソッドを使用したプレゼンター
public class EmployeePresenter : Presenter<IEmployeeView>
{
private readonly IEmployeeController _controller;
[InjectionConstructor]
}
public EmployeePresenter(IEmployeeController controller)
{
_controller = controller;
}
コントローラーが追従する
public class EmployeeController : IEmployeeController
{
private readonly IEmployeeDataProvider _provider;
[InjectionConstructor]
public EmployeeController(IEmployeeDataProvider DataProvider)
{
_provider = DataProvider;
}
}
プロバイダと同じ
public class EmployeeController : IEmployeeController
{
private readonly IEmployeeDataProvider _provider;
[InjectionConstructor]
public EmployeeController(IEmployeeDataProvider DataProvider)
{
_provider = DataProvider;
}
}
最後に、通常のコンストラクターのみを含むセッション マネージャーです。
public class NHibernateSessionManager : INHibernateSessionManager
{
private readonly ISessionFactory _sessionFactory;
public NHibernateSessionManager()
{
_sessionFactory = GetSessionFactory();
}
}
ページ リクエストが開始されると、HttpModule によってページ上で BuildUp() メソッドが呼び出されます。次に、Unity は Dependency 属性でマークされたプロパティを確認し、コンテナをチェックして、内部に EmployeePresenter オブジェクトが存在するかどうかを確認します。
コンテナーにはそのようなオブジェクトがないため、EmployeePresenter を作成しようとします。Presenter 内に表示されるクラスを作成するための検査では、IEmployeeController を注入する必要があるコンストラクターが必要です。コンテナには実際にはコントローラーのマネージャーがあるため、ページ要求の開始時に存在しないインスタンスがコンテナーに存在するかどうかを確認し、コントローラーをインスタンス化します。
その後、Unity は、コントローラーが IEmployeeDataProvider を挿入する必要があることを確認し、プロバイダーがセッション マネージャーを挿入する必要があるポイントに最終的に到達するまで、このプロセスを続行します。セッション マネージャーはインジェクションを行う必要がなくなったため、Unity はセッション マネージャーのインスタンスを作成し、指定された ContainerLifeTimeManager のコンテナーに保存し、それをプロバイダーにインジェクトしてそのインスタンスを保存します。ページの EmployeePresenter 依存関係。