我使用Unity MVC3代碼http://unitymvc3.codeplex.com/爲我的IUnitOfWork的每個請求實例創建NHibernate會話。MVC 3,Unity 2 - 每個請求生命週期管理器
它幾個星期前工作,我做了一些更改,現在我的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 ...但代碼有效,所以它以某種方式regi測量/拉動物體,使其靜止。
感謝您的意見。我在工廠背後的推理是因爲我們可能需要爲每個請求(每個數據庫一個)提供多個工作單元/ ISessions - 因此IUnitOfWork的指定註冊背後的原因。我最終的計劃是將業務層的IService對象注入到控制器中。 – 2011-06-16 12:37:07
@Chris - 我看不到工廠在代碼示例中如何使用。控制器構造函數只是通過靜態容器解析存儲庫。有什麼缺失? – MangoBrainz 2011-06-16 13:35:09