NInject 复杂的动态数据注入

NInject complex injection with dynamic data

我有一个算法 运行,像这样:

public interface IAlgorithm
{
    void Run();
}

这取决于 IContainer 界面,如下所示:

public interface IContainer
{
    int Size();
}

该接口的实现需要从UI

中获取一些数据
public class Container : IContainer
{
    private readonly List<int> _data;

    public Container(IEnumerable<int> data)
    {
        _data = new List<int>(data);
    }

    public int Size()
    {
        return _data.Count;
    }
}

那么 IAlgorithm 的实现可能如下所示:

public class Algorithm : IAlgorithm
{
    private readonly IContainer _container;

    public Algorithm(IContainer container)
    {
        _container = container;
    }

    public void Run()
    {
        Console.WriteLine(_container.Size());
    }
}

我想实现这个接口,以便它可以通过 NInject 注入(这样我就可以将它用作 ViewModel 的构造函数参数)。

public interface IAlgorithmFactory
{
    IAlgorithm Create(IEnumerable<int> data);
}

问题是:在 Algorithm 构造期间,我需要能够从 Kernel 中获取 IContainer 的正确实例。在现实世界的情况下,算法的依赖图非常大,没有一个东西需要从数据中创建,但是 3 这些东西是其他东西的进一步依赖。

我的解决方案是,所有需要从数据创建的 类 都有名为 Initialize 的方法。调用者必须在使用其他方法之前初始化这些服务。这听起来像是一种不好的做法。

其实我说的真实代码可以看here。现在一切都作为单例注入。

有没有其他方法可以通过 NInject 注入这些东西?

注意:我已经从设计的角度提出了这个问题here。我认为这是获得有关 NInject 解决方案的具体答案的更好地方。

只要使用Ninject配置,你就可以这样做:

        var kernel = new StandardKernel();
        kernel.Bind<IContainer>()
            .To<Container>()
            .WithConstructorArgument("data",
                ctx => ctx.Request.ParentContext.Parameters
                    .Single(x => x.Name == "data")
                    .GetValue(ctx, null));
        kernel.Bind<IAlgorithm>().To<Algorithm>();
        kernel.Bind<IAlgorithmFactory>().ToFactory();

        var factory = kernel.Get<IAlgorithmFactory>();
        var algorithm = factory.Create(new List<int>() { 1 });

这里的 data 参数是从工厂方法参数中获取的,并传递给 Container 构造函数。