我的模型大致如下:
public interface IUnitOfWork { }
public class UnitOfWork : IUnitOfWork { }
public interface IService { }
public class Service : IService
{
public IUnitOfWork UnitOfWork { get; set; }
}
public class ViewModel
{
public IService Service { get; set; }
}
可能是这样的配置:
container.Register(Component.For<IService>().ImplementedBy<Service>()
.LifeStyle.Transient
Component.For<IUnitOfWork>().ImplementedBy<UnitOfWork>()
.LifeStyle.Transient,
Component.For<ViewModel>().LifeStyle.Transient);
我需要在不同的点上解决两个ViewModel实例(我正在使用一个类型化的工厂,但为了简单起见,我们将它放在一边,并假设我使用的是原始容器)
问题是,我需要在不同的点解析两个ViewModel
的实例(来自另一个知道两者的ViewModel),并且他们需要共享相同的{{1} }。
所以,像这样:
IUnitOfWork
现在,分享服务非常容易。我只需要做一些事情:
var vm1 = container.Resolve<ViewModel>();
//...later
var vm2 = container.Resolve<ViewModel>();
但当然实际模型更复杂(不同的ViewModel,每个都有更多的服务),所以这不是一个选项。
我可以将var vm2 = container.Resolve<ViewModel>(new { vm1.Service });
传递给UnitOfWork
,但默认情况下不会使用它(这是有意义的)。有没有办法在解析第二个Resolve
时使用该参数(可能通过在某处注册一个委托)?
我希望能够做到以下几点:
ViewModel
并获得var vm2 = container.Resolve<ViewModel>(new { UnitOfWork });
ViewModel
具有该特定Service
的{{1}}。
答案 0 :(得分:2)
如果您需要共享组件而无法设置为singleton(富客户端)或perwebrequest,则需要使用Contextual生活方式。 check this thread看到我最后一次评论下载贡献与上下文生活方式
对于你的情况我假设这两个ViewModel将被1 View ...使用所以View + UoW需要Contextual Lifestyle
check also this one too最后看到评论
答案 1 :(得分:1)
解决方案是使用ContextualLifestyle
与自定义工厂结合使用,该工厂保留对ContainerContext
的引用,以便在解析另一个ViewModel
时使用相同的工具。