上下文和特定于参数的注入Ninject 2依赖图

时间:2011-07-11 14:29:58

标签: c# ninject ninject-2

我有兴趣使用IoC和Ninject创建一个实现IDistributor接口的对象实例。

我已根据需要创建了一个concerete实现(Distributor)和所有依赖对象/接口。

Distributor需要注入构造函数的依赖关系IDistributorContext。具体类型DistributorContext只能通过在运行时传入参数来创建。

我很难决定实现这个的最佳方法,也是最好的方法来封装它以暴露给我的应用程序的其余部分。目前,我已经决定创建一个Factory,它负责创建Ninject内核,并解决Create方法中的依赖关系。所以,我的问题是:

  1. 这是首选解决方案吗?或者创建一个然后暴露给我的其他程序集并允许它们实例化对象的模块会更好吗?
  2. 在运行时创建Distributor的首选方法是什么?注意需要在依赖关系图中向DistributorContext对象提供的运行时参数。
  3. 代码是:

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

    编辑:

    我的应用程序是根据存储在XML中的配置设置创建多个分发服务器。我不希望将基于服务的配置与我的分销商实施相结合,这就是我开始创建工厂的原因。

    另一种方法是创建IDistributorConfiguration并让Ninject自动为我的消费服务提供Distributors列表。但话说回来,我不确定这会更好吗?

1 个答案:

答案 0 :(得分:1)

有效吗?是的,是的。

这是首选解决方案吗?可能不是。这是一个复杂的解决方案,通常暗示实施中存在问题。但要回答这个问题,您必须提供信息,了解实施背后的目标。按目标我并不是指你想要Ninject做什么,而是你的应用应该做什么。