C# Ninject 2依赖关系图中特定于上下文和参数的注入
我感兴趣的是创建一个对象的实例,该对象使用IoC和Ninject实现我的C# Ninject 2依赖关系图中特定于上下文和参数的注入,c#,ninject,ninject-2,C#,Ninject,Ninject 2,我感兴趣的是创建一个对象的实例,该对象使用IoC和Ninject实现我的IDistributor接口 我已经创建了一个concrete实现(Distributor),并根据需要创建了所有依赖对象/接口 分发服务器需要类型为IDistributorContext的构造函数注入依赖项。具体类型DistributorContext只能通过在运行时传入参数来创建 我正在努力确定实现这一点的最佳方式,以及封装这一点以暴露于我的应用程序的其余部分的最佳方式。目前,我已经决定创建一个工厂,负责创建一个Ninj
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我想你误解了我的意思。您的目标是辩护地不创建分销商(至少我希望如此,因为这本身没有价值)。您的目标更可能是创建一些在某种系统/组件之间进行调解的东西。分销商正是解决这个问题的方法。缺少的是有关您希望使用分销商解决的问题的信息。否决票的原因是什么?:我只是说是的,它是有效的,很有可能有更好的解决方案,但可以告诉您如何做得更好的信息非常少。