ServiceLocator
code:.cs
public class ServiceLocator
{
private Dictionary<Type, object> container = new Dictionary<Type, object>();
public T Resolve<T>()
{
return (T)containertypeof(T);
}
public void Register<T>(T instance)
{
container.Add(typeof(T), instance);
}
}
C#
オブジェクトを事前に登録しておくことで適切なオブジェクトを後から参照できるデザインパターン
スタートアップで各interfaceに対してインスタンスを登録し,利用側が利用する.
interfaceに対するインスタンスが変化しても,利用側に修正が必要なくスタートアップの変更のみで済む.
Cons.
依存関係が外部から見えにくくなる.
利用側を単体で利用しようとしたとき,ServiceLocatorに登録がされていないとインスタンスが取得できずエラーになる.
テストの維持が難しくなる.
ServiceLocatorを利用する部分が増えると,テストを修正する必要がある上,実行時エラーにしかならない.
これらの弱点はコンストラクタインジェクションなどで解決できる.