これは、Unityのバグを示しているように見えるコンソール アプリケーションの例です (Unity NugGet パッケージを追加すると正常に動作します) 。
using System;
using Microsoft.Practices.Unity;
class GC { public static UnityContainer Container = new UnityContainer();}
class Program
{
static void Main(string[] args)
{
GC.Container.RegisterType<MyView>();
var myView = GC.Container.Resolve<MyView>();
Console.ReadLine();
}
}
public class MyClassDesign: MyClass{}
public class MyClass: VMBase<MyClass, MyClassDesign>{}
public abstract class VMBase<TViewModel, TDesignVM> where TDesignVM:TViewModel
{
static VMBase()
{
if (!GC.Container.IsRegistered(typeof(TViewModel)))
GC.Container.RegisterType(typeof (TViewModel), typeof(TDesignVM));
}
}
public class MyView
{
public MyView(MyClass myClass)
{
Console.WriteLine("Bad: "+myClass.GetType().ToString());
Console.WriteLine("Good: "+GC.Container.Resolve<MyClass>().GetType());
}
}
出力は次のとおりです。
悪い: MyClass
良い: MyClassDesign
解決された型はMyClass
. しかし、そうあるべきですMyClassDesign
。(静的コンストラクターは、クラスで MyClass が解決される前に実行されMyView
ます。)
Unity で静的コンストラクターでマッピングをセットアップできるようにするにはどうすればよいですか?
注: UnityContainer の設定を (コードではなく) ファイルで変更すると、すべて正常に動作します。しかし、私はこれを外部ファイルに依存したくありません。(あまり多くの依存関係を持たせたくない再利用可能なテンプレートを作成しています。)