c# - 在 Ninject 2 依赖关系图中进行特定于上下文和参数的注入(inject)

标签 c# ninject ninject-2

我有兴趣使用 IoC 和 Ninject 创建一个对象实例,该实例实现了我的 IDistributor 接口(interface)。

我已经创建了一个具体的实现(Distributor),以及所有需要的依赖对象/接口(interface)。

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

我正在努力决定实现它的最佳方式,以及封装它以便向我的应用程序的其余部分公开的最佳方式。目前我已经决定创建一个Factory,负责创建Ninject Kernel,并在Create方法中解析依赖。所以,我的问题是:

  1. 这是首选解决方案吗?或者创建一个模块然后暴露给我的其他程序集并允许它们实例化对象会更好吗?
  2. 在运行时创建我的 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/

相关文章:

c# - 共享点 : Add existing site column to existing content type Programatically

c# - 如何在 lambda 表达式中放入两个条件

c# - Reactive 的 "Buffer until quiet"行为?

c# - 使用 Ninject 2.0 为 C# ASP.NET(非 MVC)注入(inject)依赖项

asp.net-mvc - MVC 3 依赖解析器还是 Ninject MVC 插件?

c#-4.0 - Ninject.Extensions.Logging.Log4net 意外行为

c# - .NET 中的 lambda 表达式和谓词有什么区别?

c# - NInject 相当于 Autofac 的 AsClosedTypesOf

ninject - 在 Ninject 2 中,如何让两个具有不同设置的内核共享绑定(bind)?

c# - 使用 Ninject 的项目依赖项