我有兴趣使用 IoC 和 Ninject 创建一个对象实例,该实例实现了我的 IDistributor
接口(interface)。
我已经创建了一个具体的实现(Distributor
),以及所有需要的依赖对象/接口(interface)。
Distributor
需要类型为 IDistributorContext
的构造函数注入(inject)依赖项。具体类型 DistributorContext
只能通过在运行时传入参数来创建。
我正在努力决定实现它的最佳方式,以及封装它以便向我的应用程序的其余部分公开的最佳方式。目前我已经决定创建一个Factory,负责创建Ninject Kernel,并在Create
方法中解析依赖。所以,我的问题是:
- 这是首选解决方案吗?或者创建一个模块然后暴露给我的其他程序集并允许它们实例化对象会更好吗?
- 在运行时创建我的
Distributor
的首选方法是什么?注意需要向依赖关系图下方的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;
}
}
编辑:
我的应用程序正在根据存储在 XML 中的配置设置创建多个分发器。我不想将基于服务的配置与我的分销商实现相结合,这就是我走上创建工厂之路的原因。
另一种方法是创建一个 IDistributorConfiguration
并让 Ninject 自动向我的消费服务提供一个 Distributors
列表。但话又说回来,我不确定这是否更好?
最佳答案
工作正常吗?是的。
这是首选解决方案吗?可能不会。这是一个复杂的解决方案,通常暗示实现中存在问题。但要回答这个问题,您必须提供信息,说明您的实现背后的目标是什么。我所说的目标并不是指您希望 Ninject 做什么,而是指您的应用程序应该做什么。
关于c# - 在 Ninject 2 依赖关系图中进行特定于上下文和参数的注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6651674/