免責事項:私は一般的に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