Castle:使用现有(非单个)实例进行较低级别的依赖

时间:2011-07-12 14:42:59

标签: castle-windsor

我的模型大致如下:

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}}。

2 个答案:

答案 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时使用相同的工具。