我正在寻找一些帮助来创建 IScopeAccessor 的实现,或者寻找一个新的解决方案,这将允许我为每个 ViewModel 提供一个 NHibernate 会话。
我知道温莎现在支持所见的范围生活方式(这里)。但是,该示例使用 using 块创建特殊范围并在 using 中调用 container.resolve。
_container.Register(Component.For<A>().LifestyleScoped());
using (_container.BeginScope())
{
var a1 = _container.Resolve<A>();
var a2 = _container.Resolve<A>();
Assert.AreSame(a1, a2);
}
我想不出一种方法来完成这项工作,因为我不想传递容器,并且我希望范围与创建的 ViewModel 相关联,这将在需要时动态发生。
作为替代方案,看起来我可以创建 IScopeAccessor 的实现,根据 Krzysztof Koźmic (此处)将允许我
“......提供你喜欢的任何范围。范围在这里是一个抽象术语,它可以是任何东西。”
不幸的是,我找不到不特定于基于 Web 的场景的 IScopeAccessor 的实现,我正在努力理解我需要做什么才能将“任何东西”变成有效的范围。
我找到了一个我想使用 Ninject 做什么的例子(http://www.emidee.net/index.php/2010/08/23/ninject-use-one-database-session-per-view-model /):
Bind<ISession>().ToMethod(ctx =>
{
var session = ctx.Kernel.Get<....>().BuildSessionFactory().OpenSession();
return session;
})
.InScope(context =>
{
var request = context.Request;
if (typeof(IViewModel).IsAssignableFrom(request.Service))
return request;
while ((request = request.ParentRequest) != null)
if (typeof(IViewModel).IsAssignableFrom(request.Service))
return request;
return new object();
});
在 Ninject 中,InScope 表示只要回调返回的对象保持活动状态,就应该重用由绑定创建的任何实例。本质上,此回调返回根级 ViewModel(因为 ViewModel 可以嵌套)。
关于如何使用 Windsor 做同样的事情或获得同样的结果有什么想法吗?