最近、EnterpriseLibrary5とUnityに切り替えました。サーフィンをして「サービスロケーターはアンチパターンです」についてのヒスを読み始めるまで、提供された例に非常に満足していました。そこから、CompositeRootとHollywoodPrincipalの「電話しないでください。電話します」という文章に出くわしました。
Composite Rootの利点は理解していると思いますが、アプリケーションが必要とするクラスのインスタンスを取得するために、CompositeRootを呼び出さないようにする方法がわかりません。ですから、私はその考え全体を誤解しているのではないかと思います。
一元化されたファクトリパターンを実行するための新しい方法として、これに取り組んでいます。しかし、ある時点で、インスタンスを取得するためにファクトリパターンを呼び出す必要がありますか?したがって、私が読んだ以下のコードでは、Unity Containerをアプリのルートの近くに作成する必要があります(フォームではありません)。これにより、例外処理とロギングのために私のDIが処理されます。(これはたった2分のプレイコードなので、無意味であることに注意してください)
public partial class Form1 : Form
{
public IUnityContainer Container { get; protected set; }
public Form1()
{
InitializeComponent();
}
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
this.Container = new UnityContainer().AddNewExtension<EnterpriseLibraryCoreExtension>();
try
{
throw new NullReferenceException("Mucking around.");
}
catch (Exception ex)
{
TaxCalculator calc = this.Container.Resolve<TaxCalculator>(new ParameterOverride("fire", 888));
calc.LogWriter.Write(calc.Fire, "muckaround");
}
}
public class TaxCalculator
{
private ExceptionManager _exceptionManager;
public LogWriter LogWriter { get; protected set; }
public string Fire { get; set; }
public TaxCalculator(ExceptionManager em, LogWriter lw, int fire)
{
this._exceptionManager = em;
this.LogWriter = lw;
this.Fire = fire.ToString();
}
}
問題は、TaxCalculatorFactoryを呼び出すことができず、コンテナを呼び出すことができない場合、または単にコンテナ自体を呼び出す場合、特定のタイプのTax Calculatorを取得するにはどうすればよいですか?
インスタンスはどのように/どこから取得しますか?アプリを起動し、アプリの存続期間中に必要な場合と不要な場合がある一連のファクトリを構築してから、アプリのさまざまなレイヤーにファクトリからインスタンスを要求させますか?私はたくさんのファクトリリファレンスを回しているように見えるので、利点が何であるかわかりませんか?または、コンテナ内の静的クラスを初期化して呼び出すだけですか?
あなたが混乱の中でイムを見ることができるように再:ハリウッド校長の考え。