假设我有一份简单的服务合同:
[ServiceContract(Namespace = Constants.MyNamespace)]
public interface IAccountService
{
[OperationContract]
Account GetByAccountNumber(string accountNumber);
}
这是服务:
[ServiceBehavior(Namespace = Constants.MyNamespace)]
public class AccountService : IAccountService
{
private readonly IUnitOfWorkAsync _uow;
private readonly IRepositoryAsync<Account> _repository;
public AccountService(IDataContextAsync dataContext)
{
_uow = new UnitOfWork(dataContext);
_repository = new Repository<Account>(dataContext, _uow);
}
public Account GetByAccountNumber(string accountNumber)
{
return _repository.GetByAccountNumber(accountNumber);
}
}
这是CustomServiceHostFactory:
public class CustomServiceHostFactory : ServiceHostFactory
{
protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
{
var builder = new ContainerBuilder();
builder.RegisterType<MyDbContext>().As<IDataContextAsync>();
builder.Register(c => new AccountService(c.Resolve<IDataContextAsync>())).As<IAccountService>();
using (var container = builder.Build())
{
var host = new CustomServiceHost(serviceType, baseAddresses);
host.AddDependencyInjectionBehavior<IAccountService>(container);
return host;
}
}
}
..其中CustomServiceHost以编程方式创建所有绑定/行为。我正在使用无文件激活,所以我的.config文件只有这样的部分:
<serviceHostingEnvironment>
<serviceActivations>
<add service="Company.Project.Business.Services.AccountService"
relativeAddress="Account/AccountService.svc"
factory="Company.Project.WebHost.CustomServiceHostFactory"/>
</serviceActivations>
</serviceHostingEnvironment>
我发布到IIS并可以在浏览器中查看该网站。它说&#34;你已经创建了一个服务&#34;。但是,我尝试从客户端应用程序对服务进行的任何调用都会出现以下错误:
无法解析实例,无法从此LifetimeScope中创建嵌套生命周期,因为它已经被处理掉了。
如何将Autofac与WCF和CustomServiceHostFactory一起使用?
我现在可以使用穷人的DI作为解决方法,但希望能让这个工作正常。我似乎无法在网上找到任何好的例子。感谢。
答案 0 :(得分:1)
不要丢弃容器。而不是使用using语句,保持容器活着。它需要与主持人一样长寿。
您会注意到默认的Autofac WCF内容容器是应用程序生命周期中存在的全局静态 - 这就是原因。