免责声明:我对 Ninject 和 DI 很陌生。另外,我没有和Ninject结婚。如果有人想解释这将如何在 Windsor、Unity、SourceMap 或其他东西中工作,我会全力以赴。
我有以下处理存储类型对象的类TArchived
:
public class Archiver<TArchived> where TArchived : class
{
public Archiver(Func<string> getName, IStore<TArchived> storage, Func<TArchived> getInitialState);
}
创建的实例时,它会尝试在具有从 返回的名称的实例Archiver
中查找。如果没有实例,它会创建一个具有从 . 返回的默认值的实例。storage
getName()
getInitialState()
下一个类用于Archiver
存储项目列表。但是,虽然该项目列表的大小永远不会改变,但该列表在编译时是未知的。
public class MyClass
{
public class Item
{
public string Value { get; set; }
}
public MyClass(Archiver<Item[]> archiver)
{
Archiver = archiver;
}
public static Item[] GetInitialState(IEnumerable<string> values)
{
return values.Select(value => new Item { Value = value }).ToArray();
}
public Archiver<Item[]> Archiver { get; private set; }
}
我已经像这样设置了 Ninject:
public class Tests
{
private IKernel Ninject { get; set; }
public Tests()
{
Ninject = new StandardKernel();
Ninject.Bind<IStore<MyClass.Item[]>>().To<MemoryStore<MyClass.Item[]>>();
Ninject.Bind<Archiver<MyClass.Item[]>>().To<Archiver<MyClass.Item[]>>()
.WithConstructorArgument("getName", new Func<string>(() => "TEST"))
.WithConstructorArgument("getInitialState", new Func<MyClass.Item[]>(MyClass.GetInitialState(/* what here? */)));
}
[Fact]
public void Test()
{
// testing options
var tests = new[] { "A", "B" };
var myClass = Ninject.Get<MyClass>();
}
[Fact]
public void Test_2()
{
// different testing options
var tests = new[] { "A", "B", "C" };
var myClass = Ninject.Get<MyClass>();
}
}
但我很困惑为getInitialState
参数添加什么。如果我想要不同的项目存储列表MyClass
,我需要将不同的项目传递给GetInitialState
函数。