私の MVC アプリケーションには、ユーザーのメニューを表示する共有 _Layout.cshtml ファイルがあります。
そのビューで、SimpleMembership を使用して作成され、_Layout ページで直接アクセスできる IPrincipal User にリンクされた UserProfile エンティティからの情報を表示したいと考えています。
そこで、UnitOfWork を呼び出す拡張メソッドを作成しました。次のようになります。
public static UserProfile GetUserProfile(this IPrincipal u)
{
IUnitOfWork uow = new UnitOfWork();
return uow.UserRepository.GetUserProfile(u);
}
これで動作しますが、 UnitOfWork を注入するのではなくインスタンス化しているため、いい匂いがしません....
次のような BaseController クラスがあります。
public class BaseController : Controller
{
// NOT NECESSARY TO DISPOSE THE UOW IN OUR CONTROLLERS
// Recall that we let IoC inject the Uow into our controllers
// We can depend upon on IoC to dispose the UoW for us
protected MvcApplication.Data.Contracts.IUnitOfWork _Uow { get; set; }
}
(私はこの回答に基づいてコードの一部を作成しました: https://stackoverflow.com/a/12820444/150342 )
パッケージ マネージャーを使用して StructureMap をインストールすると、このコードがアプリケーションの起動時に実行されます。
public static class StructuremapMvc
{
public static void Start()
{
IContainer container = IoC.Initialize();
DependencyResolver.SetResolver(new StructureMapDependencyResolver(container));
GlobalConfiguration.Configuration.DependencyResolver = new StructureMapDependencyResolver(container);
}
}
私が理解しているように、これは具体的な UnitOfWork クラスをコントローラーに挿入し、UnitOfWork の破棄を処理します。
残念ながら、これは IoC に関する私の理解の範囲であり、コントローラー以外の場所から UnitOfWork にアクセスしたい場合、またはコントローラーから _Layout に情報を渡すことができるかどうかはわかりません。_Layout ページにデータを取得したいのですが、そこから UnitOfWork にアクセスする方法、または UnitOfWork を拡張メソッドに挿入する方法について混乱しています。