私はUnityを使い始めようとしていますが、この特定の問題について助けを求めています。依存性注入/ Unityとは何か、プログラムでこれを行う方法はすでに理解していますが、メンバーがいつどのように入力されるかはわかりません。 Dependency-Attributeでマークされています。
class Program
{
static Program()
{
uContainer = new UnityContainer();
var section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity");
section.Configure(uContainer);
}
private static IUnityContainer uContainer;
[InjectionMethod]
public static void InjectTrace(ITraceManager traceManager)
{
trace = traceManager;
}
[Dependency]
public static ITraceManager trace { get; set; }// = /*new WebTraceManager("C:\\","trace",true);//*/new EnterpriseLibaryLoggingWrapper(false);
static void Main(string[] args)
{
//Programmatically inject dependency
// TODO: Do this via attributes
//UnityContainer myContainer = new UnityContainer();
//UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity");
//section.Containers["containerOne"].Configure(myContainer);
//trace = myContainer.Resolve<ITraceManager>();
trace.ProgramStatus("Start");
trace.ProgramStatus("End");
Console.ReadLine();
}
}
プログラムでトレースプロパティを設定するMain内のコメントされていないセクションは正常に機能します。ただし、属性「依存関係」を使用すると、プロパティは設定されません。ユニティコンテナへの呼び出しがありませんか?ご協力ありがとうございました。
スティーブのアドバイスによると、静的クラスの代わりにインスタンスを使用して、例を変更しました。
static Program()
{
uContainer = new UnityContainer();
var section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity");
section.Configure(uContainer);
Instance = uContainer.Resolve<Program>();
}
Program(ITraceManager traceManager)
{
trace = traceManager;
}
static readonly Program Instance;
//Do not use Dependency Attribute
//[Dependency]
public ITraceManager trace { get; set; }// = /*new WebTraceManager("C:\\","trace",true);//*/new EnterpriseLibaryLoggingWrapper(false);
static void Main(string[] args)
{
Instance.Run();
}
void Run()
{
trace.ProgramStatus("Start");
trace.ProgramStatus("End");
Console.ReadLine();
}
しかし、呼び出すとき
Instance = uContainer.Resolve<Program>();
、プログラムがコンテナ内に登録されていないという例外を受け取りました。それは本当ですが、Unityは代わりに解決された依存関係を持つ既知のタイプのプログラムをプログラムコードで返すべきではありませんか?Webで見つけた例では、常にこのようなコンストラクターインジェクションを使用しています
IUnityContainer uContainer = new UnityContainer();
MyObject myInstance = uContainer.Resolve<MyObject>();
私はついにインジェクションコンストラクターのサンプルに問題があることを発見しました。もちろん、コンストラクターはPUBLICである必要があります。例外メッセージは私を少し混乱させました。