Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.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# Ninject 2依赖关系图中特定于上下文和参数的注入_C#_Ninject_Ninject 2 - Fatal编程技术网

C# Ninject 2依赖关系图中特定于上下文和参数的注入

C# Ninject 2依赖关系图中特定于上下文和参数的注入,c#,ninject,ninject-2,C#,Ninject,Ninject 2,我感兴趣的是创建一个对象的实例,该对象使用IoC和Ninject实现我的IDistributor接口 我已经创建了一个concrete实现(Distributor),并根据需要创建了所有依赖对象/接口 分发服务器需要类型为IDistributorContext的构造函数注入依赖项。具体类型DistributorContext只能通过在运行时传入参数来创建 我正在努力确定实现这一点的最佳方式,以及封装这一点以暴露于我的应用程序的其余部分的最佳方式。目前,我已经决定创建一个工厂,负责创建一个Ninj

我感兴趣的是创建一个对象的实例,该对象使用IoC和Ninject实现我的
IDistributor
接口

我已经创建了一个concrete实现(
Distributor
),并根据需要创建了所有依赖对象/接口

分发服务器
需要类型为
IDistributorContext
的构造函数注入依赖项。具体类型
DistributorContext
只能通过在运行时传入参数来创建

我正在努力确定实现这一点的最佳方式,以及封装这一点以暴露于我的应用程序的其余部分的最佳方式。目前,我已经决定创建一个工厂,负责创建一个Ninject内核,并在
create
方法中解析依赖项。因此,我的问题是:

  • 这是首选的解决方案吗?还是最好创建一个模块,然后将其公开给我的其他程序集,并允许它们实例化该对象
  • 在运行时创建分发服务器的首选方法是什么?注意需要提供给依赖关系图下方的
    DistributorContext
    对象的运行时参数
  • 代码是:

    public class DistributorFactory : IDistributorFactory
    {
        private const string ContextIdKey = "contextIdKey";
        private readonly IKernel _kernel;
    
        public DistributorFactory()
        {
            _kernel = CreateKernel();
        }
    
        public IDistributor Create(int queueId)
        {
            return _kernel.Get<IDistributor>(new Parameter(ContextIdKey, queueId, true));
        }
    
        private IKernel CreateKernel()
        {
            var kernel = new StandardKernel();
    
            kernel.Bind<IDistributorContext>().To<DistributorContext>().WithConstructorArgument("contextId",
                (context, target) => context.Parameters.First(x => x.Name == QueueIdKey).GetValue(context, target));
    
            kernel.Bind<IReceiveQueue>().To<ReceiveQueue>();
            kernel.Bind<IDistributor>().To<Distributor>();
    
            return kernel;
        }
    }
    
    public class Distributor : IDistributor
    {
        private readonly IReceiveQueue _receiveQueue;
        private readonly IDistributorContext _distributorContext;
    
        public Distributor(IReceiveQueue receiveQueue, IDistributorContext distributorContext)
        {
            _receiveQueue = receiveQueue;
            _distributorContext = distributorContext;
        }
    }
    
    public class DistributorContext: IDistributorContext
    {
        private readonly int _contextId;
    
        public DistributorContext(int contextId)
        {
            _contextId = contextId;
        }
    }
    
    公共类DistributorFactory:IDistributorFactory
    {
    私有常量字符串ContextIdKey=“ContextIdKey”;
    私有只读IKernel_内核;
    公共分销商工厂()
    {
    _kernel=CreateKernel();
    }
    公共IDistributor创建(int queueId)
    {
    返回_kernel.Get(新参数(ContextIdKey,queueId,true));
    }
    私有IKernel CreateKernel()
    {
    var kernel=新的标准内核();
    kernel.Bind().To().WithConstructorArgument(“contextId”,
    (context,target)=>context.Parameters.First(x=>x.Name==QueueIdKey.GetValue(context,target));
    kernel.Bind().To();
    kernel.Bind().To();
    返回内核;
    }
    }
    公共类分发者:IDistributor
    {
    专用只读IReceiveQueue\u receiveQueue;
    私有只读IDistributorContext_distributorContext;
    公共分发服务器(IReceiveQueue receiveQueue、IDistributor上下文分发服务器Context)
    {
    _receiveQueue=receiveQueue;
    _distributorContext=distributorContext;
    }
    }
    公共类DistributorContext:IDistributorContext
    {
    私有只读int_contextId;
    公共DistributorContext(int-contextId)
    {
    _contextId=contextId;
    }
    }
    
    编辑: 我的应用程序正在基于XML中存储的配置设置创建多个分发服务器。我不希望将基于服务的配置与分发服务器实现结合起来,这就是为什么我选择创建工厂的原因


    另一种方法是创建
    IDistributor配置
    ,让Ninject自动向我的消费服务提供
    分销商列表
    。但话说回来,我不确定这是否更好?

    是否有效?是的,辩护


    这是首选的解决方案吗?可能不会。这是一个复杂的解决方案,通常意味着在实现中存在错误。但是要回答这个问题,您必须提供信息,说明您的实现背后的目标是什么。我所说的目标并不是指您希望Ninject做什么,而是指您的应用程序应该做什么。

    我的应用程序希望动态创建多个分发服务器(在运行时,通过配置设置或其他方式)。我更新了我的问题,希望能让这更清楚。@sukhuk我想你误解了我的意思。您的目标是辩护地不创建分销商(至少我希望如此,因为这本身没有价值)。您的目标更可能是创建一些在某种系统/组件之间进行调解的东西。分销商正是解决这个问题的方法。缺少的是有关您希望使用分销商解决的问题的信息。否决票的原因是什么?:我只是说是的,它是有效的,很有可能有更好的解决方案,但可以告诉您如何做得更好的信息非常少。