私は工場バインディングをNinjectなどのオブジェクトに注入しています。NinjectはReactiveUIへのアップグレード後に暗黙的な自己バインディングのために複数のバインディングを見つけています。7.2
[Inject]
public Func<TNewDocument> DocumentFactory { get; set; }
は、我々は
var newDoc = DocumentFactory()
DocumentFactoryのへの最初の呼び出し()が成功したようにそれを呼び出します。
Ninjectは、アクティブ化時点でTNewDocument
に複数のバインディングがあると報告します。
私の代わりに工場を使用してのカーネルを直接呼び出すために私のコードを変更しました。私は、私が実際にGetAll
呼び出しから返されるオブジェクトの数をチェック
var docs Kernel.GetAll<TNewDocument>().ToList();
if(docs.Count!=1){
Console.WriteLine("boo");
}
return docs[0]; // A work around to stop the app crashing
をしました。この番号は、新しいオブジェクトを作成するたびに増加します。
最初に1つのオブジェクトが返されます。 2回目のオブジェクト、3回目の3回など。
私たちはgitを使ってリポジトリを二等分し、改ざんの変化を発見しました。それはReactiveUI 7.1 to 7.2からのアップグレードでした。ナゲットの変更以外のコードの変更は他にありませんでした。
しかし、ReactiveUIはNinjectとの基本的な関係のみを持ちます。私は以下のようにRxUIにサービスロケータを提供する必要があります。
var customResolver = new FuncDependencyResolver(
(service, contract) =>
{
if (contract != null) return kernel.GetAll(service, contract);
var items = kernel.GetAll(service);
var list = items.ToList();
return list;
},
(factory, service, contract) =>
{
var binding = kernel.Bind(service).ToMethod(_ => factory());
if (contract != null) binding.Named(contract);
});
Locator.Current = customResolver;
なぜRxUIをアップグレードするとこの問題が発生するのかわかりません。何か案は?