使用Autofac的自动注册功能时,如何指定一种类型应为InstancePerRequest

时间:2016-05-20 15:28:21

标签: c# asp.net-web-api dependency-injection autofac

我们有一个Web API项目,并使用Autofac Web API Integration作为IoC容器。我们用来注册所有类型的代码如下:

public class CompositionRootConfigurator
{
    public static AutofacWebApiDependencyResolver Configure(Assembly servicesAssembly)
    {
        var container = BuildContainer(servicesAssembly);
        var resolver = new AutofacWebApiDependencyResolver(container);

        return resolver;
    }

    public static IContainer BuildContainer(Assembly servicesAssembly)
    {
        /*TO DELETE ONCE THE REFERENCES ISSUE IS RESOLVED!*/
        var dummy = new EmployeesBL(new ContextFactory(new DBContextFactory(new RoleBasedSecurity(), new Identity())));

        var builder = new ContainerBuilder();
        if (servicesAssembly != null) // this is a temporary workaround, we need a more solid approach here
        {
            builder.RegisterApiControllers(servicesAssembly);
        }

        /* Registers all interfaces and their implementations from the following assemblies in the IoC container
         * 1. CB.CRISP.BL
         * 2. CB.CRISP.BL.CONTRACTS
         * 3. CB.CRISP.DAL
         * 4. CB.CRISP.DAL.CONTRACTS
         * The current assembly is excluded because the controllers were registered with the builder.RegisterApiControllers expression above.
        */
        var appAssemblies = AppDomain.CurrentDomain
            .GetAssemblies()
            .Where(a => a.ToString().StartsWith("CB.CRISP"))
            .ToArray();
        builder.RegisterAssemblyTypes(appAssemblies).AsImplementedInterfaces();
        if (servicesAssembly != null)
        {
            builder.RegisterAssemblyTypes(servicesAssembly).AsImplementedInterfaces();
        }

        return builder.Build();
    }
}

现在假设我们有 MyType ,它实现了 IMyType ,这是唯一一个必须是每个请求的单个实例,它将被注入到沿着层次结构。

我对如何在现有代码中指定它感到茫然。如果我继续做下去

builder.RegisterType<MyType>()
       .As<IMyType>()
       .InstancePerRequest();

因为它也会在所有其他人身上注册一个注册会覆盖另一个,是否会重复,是否存在潜在问题?

感谢您的见解。

1 个答案:

答案 0 :(得分:0)

Autofac将覆盖第一次注册并接受最后一次注册。 Here更详细。

因此,您应在注册所有类型后注册MyType

我没有看到任何潜在的问题。

但你可以注册这样的所有类型以确定。

builder.RegisterAssemblyTypes(servicesAssembly).Except<MyType>().AsImplementedInterfaces();

Here是有关扫描的更多细节。