Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取通过Autofac模块注册的对象的多个实例_C#_Dependency Injection_Autofac_Ioc Container - Fatal编程技术网

C# 获取通过Autofac模块注册的对象的多个实例

C# 获取通过Autofac模块注册的对象的多个实例,c#,dependency-injection,autofac,ioc-container,C#,Dependency Injection,Autofac,Ioc Container,我有一个用例,我需要从Autofac模块获得两个注册对象的副本,并将它们传递给注册不同类型的对象 在下面的代码示例中 我想用configdbConfig传递DataProtectionService的对象以注册MyDbRepo 类似地,我想通过configcacheConfig传递DataProtectionService的对象来注册MyCacheRepo 但是,我不知道我该怎么做?我是不是错过了一些基本的东西 我没有删除此数据保护服务模块的选项。有没有办法达到我的期望 公共类DataProte

我有一个用例,我需要从Autofac模块获得两个注册对象的副本,并将它们传递给注册不同类型的对象

在下面的代码示例中

  • 我想用config
    dbConfig
    传递DataProtectionService的对象以注册
    MyDbRepo
  • 类似地,我想通过config
    cacheConfig
    传递DataProtectionService的对象来注册
    MyCacheRepo
  • 但是,我不知道我该怎么做?我是不是错过了一些基本的东西

    我没有删除此
    数据保护服务模块的选项。有没有办法达到我的期望

    公共类DataProtectionService模块:模块
    {
    私有只读字符串配置;
    公共数据保护服务模块(字符串配置)
    {
    this.config=config;
    }
    受保护的覆盖无效负载(ContainerBuilder builder)
    {
    builder.Register(compContext=>
    {//这里有一个复杂的逻辑
    }).OnRelease(instance=>instance.Dispose());
    builder.Register(c=>
    {
    //生成IDataProtectionService对象的逻辑
    //此逻辑涉及使用此类的配置字段。
    }).As();
    }
    }
    公共类MyDbRepo:IMyDbRepo
    {
    IDataProtectionService数据保护服务;
    公共MyDbRepo(IDataProtectionService数据保护服务)
    {
    this.dataProtectionService=dataProtectionService;
    }
    }
    公共类MyCacheRepo:IMyCacheRepo
    {
    IDataProtectionService数据保护服务;
    公共MyCacheRepo(IDataProtectionService数据保护服务)
    {
    this.dataProtectionService=dataProtectionService;
    }
    }
    //我的后端微服务的Program.cs
    var builder=new ContainerBuilder();
    RegisterModule(新的DataProtectionServiceModule(“dbConfig”);
    builder.RegisterModule(新的DataProtectionServiceModule(“cacheConfig”);//我想,这是错误的。
    builder.RegisterType().As().SingleInstance();
    builder.RegisterType().As().SingleInstance();
    
    您可以使用。然后在您的注册中添加一个特定的
    Resolve

        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
    
    
            // Program.cs of my backend micro service
            var builder = new ContainerBuilder();
            builder.RegisterModule(new DataProtectionServiceModule("dbConfig", DeviceState.Db));
            builder.RegisterModule(new DataProtectionServiceModule("cacheConfig", DeviceState.Cache)); // I have figured, this is wrong.
            builder.RegisterType<MyDbRepo>().WithParameter(
                new ResolvedParameter(
                    (pi, ctx) => pi.ParameterType == typeof(IDataProtectionService),
                    (pi, ctx) => ctx.ResolveKeyed<IDataProtectionService>(DeviceState.Db)
                )
            ).As<IMyDbRepo>().SingleInstance();
            builder.RegisterType<MyCacheRepo>().WithParameter(
                new ResolvedParameter(
                    (pi, ctx) => pi.ParameterType == typeof(IDataProtectionService),
                    (pi, ctx) => ctx.ResolveKeyed<IDataProtectionService>(DeviceState.Cache)
                )
            ).As<IMyCacheRepo>().SingleInstance();
    
            var container = builder.Build();
    
            var cache = container.Resolve<IMyCacheRepo>();
            var db = container.Resolve<IMyDbRepo>();
    
        }
    }
    
    public enum DeviceState { Cache, Db }
    
    
    public class DataProtectionServiceModule : Module
    {
        private readonly string config;
        private readonly DeviceState _state;
    
        public DataProtectionServiceModule(string config, DeviceState state)
        {
            this.config = config;
            _state = state;
        }
    
        protected override void Load(ContainerBuilder builder)
        {
            builder.Register<Token>(compContext =>
            { // a complex logic here
            }).OnRelease(instance => instance.Dispose());
    
            builder.Register(c =>
            {
                // a logic to generate an object of IDataProtectionService
                // this logic involves the use of config field of this class.
                return new DataProtectionService(config);
            }).Keyed<IDataProtectionService>(_state);
        }
    }
    
    public class DataProtectionService : IDataProtectionService
    {
        public string Config { get; }
    
        public DataProtectionService(string config)
        {
            Config = config;
        }
    }
    
    
    public class MyDbRepo : IMyDbRepo
    {
        IDataProtectionService dataProtectionService;
        public MyDbRepo(IDataProtectionService dataProtectionService)
        {
            this.dataProtectionService = dataProtectionService;
        }
    }
    
    public interface IDataProtectionService
    {
    }
    
    public interface IMyDbRepo
    {
    }
    
    public class MyCacheRepo : IMyCacheRepo
    {
        IDataProtectionService dataProtectionService;
        public MyCacheRepo(IDataProtectionService dataProtectionService)
        {
            this.dataProtectionService = dataProtectionService;
        }
    }
    
    public interface IMyCacheRepo
    {
    }
    
    以及您的模块:

        protected override void Load(ContainerBuilder builder)
        {
            //builder.Register<Token>(compContext =>
            //{ // a complex logic here
            //}).OnRelease(instance => instance.Dispose());
    
            builder.Register(c =>
            {
                // a logic to generate an object of IDataProtectionService
                // this logic involves the use of config field of this class.
                return new DataProtectionService(config);
            }).Named<IDataProtectionService>(config);
        }
    
    protected override void Load(ContainerBuilder生成器)
    {
    //builder.Register(compContext=>
    //{//这里有一个复杂的逻辑
    //}).OnRelease(instance=>instance.Dispose());
    builder.Register(c=>
    {
    //生成IDataProtectionService对象的逻辑
    //此逻辑涉及使用此类的配置字段。
    返回新的DataProtectionService(配置);
    }).命名(配置);
    }
    
    如果我通过serviceCollection将IDataProtectionService的依赖项注入到构建器中,它也会起作用吗:
    cs builder.Register(c=>{serviceCollection serviceCollection=new serviceCollection();serviceCollection.AddDataProtection()//由asp.net ServiceProvider提供ServiceProvider=serviceCollection.BuildServiceProvider();var dataProtectionProvider=ServiceProvider.GetDataProtectionProvider();return dataProtectionProvider;})。命名(this.config)对不起,上面的代码没有插入。看不到任何立即在注释中插入具有适当缩进的代码的方法。因此,是否要使用
    Microsoft.DI
    解析实例,然后向Autofac注册该实例?我不明白为什么不应该这样做,只要实例提供给Autofac。
        protected override void Load(ContainerBuilder builder)
        {
            //builder.Register<Token>(compContext =>
            //{ // a complex logic here
            //}).OnRelease(instance => instance.Dispose());
    
            builder.Register(c =>
            {
                // a logic to generate an object of IDataProtectionService
                // this logic involves the use of config field of this class.
                return new DataProtectionService(config);
            }).Named<IDataProtectionService>(config);
        }