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
构造函数。
我有一个算法 运行,像这样:
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
构造函数。