【发布时间】:2017-02-02 09:22:28
【问题描述】:
我通过利用 AutoFac 的 ServiceHost.AddDependencyInjectionBehavior() 扩展(如 Autofac documentation 中所述)将业务层注入到自托管(InstanceContextMode=per-call)WCF 服务中
我的业务层使用的组件在每次有新请求进入时都无法重新创建(假设它需要一个持久的数据库连接)。
因此,在构建容器时,我想将 BL 服务注册为单个实例,即:
builder.RegisterType<BusinessLayer>()
.SingleInstance();
WCF 服务的业务层注入工作正常;我的问题是:
Dispose() 不会在容器中创建的任何服务上调用:不仅是业务层本身,还有“持久”服务。
我希望 BL 服务本身会发生这种情况。再次来自 Autofac docs:
如果您有单例组件(注册为 SingleInstance())它们将在容器的整个生命周期中存在。由于容器生命周期通常是应用程序生命周期,它意味着组件 直到应用程序结束才会被释放。
,但是为什么我的“子”(Autofac 注册)服务(即下面的“IPersistentService”)在生命周期范围内没有被处理——因为我没有明确地将它们设为“SingleInstance”? 注意::关闭ServiceHost后,如果在生命周期范围内手动处置业务层服务,还是这样
例如(为简洁起见,省略了 IDisposable 实现):
[ServiceContract]
public interface IMyService
{
void DoStuff();
}
public class MyService : IMyService
{
IBusinessLayer _bl;
public MyService(IBusinessLayer bl)
{
_bl = bl;
}
public void DoStuff()
{
_bl.BLDoStuff();
}
}
public interface IBusinessLayer
{
void BLDoStuff();
}
public class BusinessLayer : IBusinessLayer
{
IPersistentService _service;
public BusinessLayer(IPersistentService service)
{
_service = service;
}
public void BLDoStuff()
{
// Do something that requires a 'cached' / persistent component
_service.DoSomethingWithPersistentConnection();
}
}
public interface IPersistentService : IDisposable
{
void DoSomethingWithPersistentConnection();
}
Autofac 注册看起来像这样:
builder.RegisterType<BusinessLayer>()
.SingleInstance();
builder.RegisterType<MyPersistentService>()
.As<IPersistentService>()
.OnActivated(e => e.Instance.Start());
【问题讨论】:
-
“为什么我的 'child'(Autofac 注册)服务(即下面的 'IPersistentService')在生命周期范围为时没有被处理”。这个问题通常被称为Captive Dependency。
-
对。是的,这解释了它 - 并感谢该描述的链接。