BBauer42
BBauer42

Reputation: 3657

How to use Autofac with a CustomServiceHostFactory in an IIS hosted WCF service?

Lets say I have a simple service contract:

[ServiceContract(Namespace = Constants.MyNamespace)]
public interface IAccountService
{
    [OperationContract]
    Account GetByAccountNumber(string accountNumber);
}

Here is the service:

[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);
    }
}

Here is the 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;
        }
    }
}

..where CustomServiceHost creates all of the bindings/behaviors programmatically. I am using file-less activation so my .config file just has section like this:

<serviceHostingEnvironment>  
  <serviceActivations>                
    <add service="Company.Project.Business.Services.AccountService" 
          relativeAddress="Account/AccountService.svc" 
          factory="Company.Project.WebHost.CustomServiceHostFactory"/>
  </serviceActivations>
</serviceHostingEnvironment>

I publish to IIS and can view the site in a browser. It says "you have created a service". However, any call I try to make to the service from my client application gives the following error:

Instances cannot be resolved and nested lifetimes cannot be created from this LifetimeScope as it has already been disposed.

How do you use Autofac with WCF and a CustomServiceHostFactory?

I am able to use poor man's DI as a workaround for now but was hoping to get this working. I can't seem to find any good examples on the web. Thanks.

Upvotes: 0

Views: 744

Answers (1)

Travis Illig
Travis Illig

Reputation: 23894

Don't dispose of the container. Instead of a using statement, keep the container alive. It needs to live as long as the host.

You'll notice in the default Autofac WCF stuff the container is a global static that lives for the app lifetime - that's why.

Upvotes: 1

Related Questions