如何在IIS托管的WCF服务中使用Autofac和CustomServiceHostFactory?

时间:2015-05-08 18:07:49

标签: wcf iis dependency-injection autofac

假设我有一份简单的服务合同:

[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作为解决方法,但希望能让这个工作正常。我似乎无法在网上找到任何好的例子。感谢。

1 个答案:

答案 0 :(得分:1)

不要丢弃容器。而不是使用using语句,保持容器活着。它需要与主持人一样长寿。

您会注意到默认的Autofac WCF内容容器是应用程序生命周期中存在的全局静态 - 这就是原因。