我有兴趣使用IoC和Ninject创建一个实现IDistributor
接口的对象实例。
我已根据需要创建了一个concerete实现(Distributor
)和所有依赖对象/接口。
Distributor
需要注入构造函数的依赖关系IDistributorContext
。具体类型DistributorContext
只能通过在运行时传入参数来创建。
我很难决定实现这个的最佳方法,也是最好的方法来封装它以暴露给我的应用程序的其余部分。目前,我已经决定创建一个Factory,它负责创建Ninject内核,并解决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
列表。但话说回来,我不确定这会更好吗?
答案 0 :(得分:1)
有效吗?是的,是的。
这是首选解决方案吗?可能不是。这是一个复杂的解决方案,通常暗示实施中存在问题。但要回答这个问题,您必须提供信息,了解实施背后的目标。按目标我并不是指你想要Ninject做什么,而是你的应用应该做什么。