C# 如何根据Autofac中的可选参数将类注册为singleton?

C# 如何根据Autofac中的可选参数将类注册为singleton?,c#,.net,dependency-injection,inversion-of-control,autofac,C#,.net,Dependency Injection,Inversion Of Control,Autofac,让我用代码来解释我的问题,所以我有一个类: public class ComplexEntity { private readonly ISomeDependency _someDependency; private readonly int _optionalArg; public ComplexEntity(ISomeDependency someDependency, int optionalArg) { _someDependency =

让我用代码来解释我的问题,所以我有一个类:

public class ComplexEntity
{
    private readonly ISomeDependency _someDependency;
    private readonly int _optionalArg;

    public ComplexEntity(ISomeDependency someDependency, int optionalArg)
    {
        _someDependency = someDependency;
        _optionalArg = optionalArg;
    }
}
和模块:

public class FooModule : Module
{
    protected override void OnMap(ContainerBuilder builder)
    {
        builder.RegisterType<ConcreteDependency>().As<ISomeDependency>().SingleInstance();
        builder.RegisterType<ComplexEntity>().AsSelf();//SingleInstance fails my test below. 
    }
}

在autofac范围内,可以是单例或工厂瞬态,而不是两者。如果你需要更复杂的终身管理,我相信你需要承担责任,自己管理。如果我理解正确,您需要一个范围管理器,它要么生成新实例,要么返回单例。如果您仍然想使用DI,可以将其放入容器中,如下所示:

    private const int FactoryMode = 11;
    private const int SingletonMode = 10;

    public static void Main()
    {
        var containerBuilder = new ContainerBuilder();
        containerBuilder.RegisterType<ComplexTypeScope>().SingleInstance();
        containerBuilder.Register((c, p) => c.Resolve<ComplexTypeScope>().Get(p.TypedAs<int>()));

        var container = containerBuilder.Build();
        ComplexType instance1 = container.Resolve<ComplexType>(new TypedParameter(typeof(int), SingletonMode));
        ComplexType instance2 = container.Resolve<ComplexType>(new TypedParameter(typeof(int), SingletonMode));
        ComplexType instance3 = container.Resolve<ComplexType>(new TypedParameter(typeof(int), FactoryMode));

        Debug.Assert(ReferenceEquals(instance1, instance2));
        Debug.Assert(!ReferenceEquals(instance1, instance3));
    }

    class ComplexType
    {
    }

    class ComplexTypeScope
    {
        private readonly Lazy<ComplexType> complexTypeSingleTon;

        public ComplexTypeScope()
        {
            complexTypeSingleTon = new Lazy<ComplexType>(() => new ComplexType());
        }

        public ComplexType Get(int parameter)
        {
            return parameter == FactoryMode ? new ComplexType() : complexTypeSingleTon.Value;
        }
    }

当然,使用这种方法,容器不会管理组件的寿命,比如自动处理。

我不明白您在这里想要实现什么。看起来您正在测试模块中注册测试类型。那么,为什么你不能根据考试的要求进行注册呢?@DanielHilgarth,好的,我删除了所有提到的考试内容。你有多少不同的网上辩论?在您构建容器时是否知道它们?@nemesv,通常是一个,但这不重要。是的,他们都知道。所以我发现没有办法-我必须手动实现缓存机制:
    private const int FactoryMode = 11;
    private const int SingletonMode = 10;

    public static void Main()
    {
        var containerBuilder = new ContainerBuilder();
        containerBuilder.RegisterType<ComplexTypeScope>().SingleInstance();
        containerBuilder.Register((c, p) => c.Resolve<ComplexTypeScope>().Get(p.TypedAs<int>()));

        var container = containerBuilder.Build();
        ComplexType instance1 = container.Resolve<ComplexType>(new TypedParameter(typeof(int), SingletonMode));
        ComplexType instance2 = container.Resolve<ComplexType>(new TypedParameter(typeof(int), SingletonMode));
        ComplexType instance3 = container.Resolve<ComplexType>(new TypedParameter(typeof(int), FactoryMode));

        Debug.Assert(ReferenceEquals(instance1, instance2));
        Debug.Assert(!ReferenceEquals(instance1, instance3));
    }

    class ComplexType
    {
    }

    class ComplexTypeScope
    {
        private readonly Lazy<ComplexType> complexTypeSingleTon;

        public ComplexTypeScope()
        {
            complexTypeSingleTon = new Lazy<ComplexType>(() => new ComplexType());
        }

        public ComplexType Get(int parameter)
        {
            return parameter == FactoryMode ? new ComplexType() : complexTypeSingleTon.Value;
        }
    }