2

http://unitymvc3.codeplex.com/で Unity MVC3 コードを使用して、 IUnitOfWork のリクエスト インスタンスごとに NHibernate セッションを作成しています。

数週間前は機能していましたが、いくつか変更を加えたところ、IUnitOfWork の有効期間が静的になったようです。

私のglobal.asax.csから:

private static IUnitOfWorkFactory _UoWFactory = new UnitOfWorkFactory(Enums.Databases.MyDBName)
                                                            .AddMapping<DepartmentMap>()
                                                            .CompleteConfiguration();

/// <summary>
/// Configure Unity Application Block
/// </summary>
private void ConfigureUnity()
{
    CIUnity.UnityContainer.Container = new UnityContainer()
        .RegisterType(typeof(IRepository<>), typeof(Repository<>))
        .RegisterType<IUnitOfWork, UnitOfWork>(Enums.Databases.MyDBName.ToString(), new HierarchicalLifetimeManager(), new InjectionConstructor(Enums.Databases.MyDBName))
        .RegisterInstance<IUnitOfWorkFactory>(Enums.Databases.MyDBName.ToString(), _UoWFactory);

    DependencyResolver.SetResolver(new UnityDependencyResolver(CIUnity.UnityContainer.Container));
}

ConfigureUnity()私から呼び出されますApplication_Start()

HomeController コンストラクターからコードをテストします。

private IUnitOfWork uow;
private IUnitOfWork uow2;

public HomeController()
{
    uow = CIUnity.Container.Resolve<IUnitOfWork>(Enums.Databases.MyDBName.ToString());
    IRepository<Employee> repo = uow.GetRepository<Employee>();

    uow2 = CIUnity.Container.Resolve<IUnitOfWork>(Enums.Databases.MyDBName.ToString());
    IRepository<Department> deptrepo = uow2.GetRepository<Department>();

    var q = from a in repo.Find()
            select a;

    var d = from b in deptrepo.Find()
            select b;
}

... IUnitOfWork は同じインスタンスに解決されますが、後続のページ要求では新しい IUnitOfWork は作成されません... しかし、コードは機能するため、何らかの方法でオブジェクトを登録/プルして静的に動作させます。

4

2 に答える 2

2

IUnitOfWorkFactory を完全に取り除き、 IUnityOfWork をコントローラーに挿入するだけです-論理的に見えるリクエストごとに1つの作業単位のみが必要な場合。これにより、IoC コンテナーをサービス ロケーターとして使用するだけでなく、その機能をさらに活用できます。

HomeController コンストラクターを次のように変更するだけです。

public HomeController(IUnitOfWork unitOfWork)
{
  IRepository<Employee> repo = unitOfWork.GetRepository<Employee>();

  IRepository<Department> deptrepo = unitOfWork.GetRepository<Department>();

  ...
}

まだ追加していない場合は、次を追加します。

CIUnity.Container.RegisterControllers();

DependencyResolver.SetResolver を呼び出す前に

MVC コアがコントローラーをインスタンス化しようとすると、Unity.MVC3 リゾルバーが使用されます。このリゾルバーは、この場合 unitOfWork を意味するすべての依存関係を自動的に満たします。

Unity.MVC3 リゾルバーは、リクエストの最後に作業単位を自動的に破棄します。

于 2011-06-16T10:23:34.460 に答える
0

UnitOfWorkFactory が IUnitOfWork の依存関係を返すようにしたいですか? これを達成するには .RegisterFactory を使用する必要があるようです。ファクトリを ContainerControlledLifetimeManager に登録すると、静的メンバーに頼らずに「シングルトン」として動作します。

ライフタイム管理は、WCF (およびおそらく Web) では少し複雑になる可能性があります。私はかなり長い間、この記事のコードを使用してきました。Unity の有効期間を WCF 要求の有効期間に完全にマッピングします。目的を達成するための最良の方法についてのアイデアが得られるかもしれません。

http://drewdotnet.blogspot.com/2009/07/unity-lifetime-managers-and-wcf.html

于 2011-06-15T20:51:22.290 に答える