1

私の 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 を拡張メソッドに挿入する方法について混乱しています。

4

1 に答える 1