ViewModelLocator クラスには、おそらく次のコード行があります。
public ViewModelLocator()
{
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
SimpleIoc
これは、が呼び出されたときに DI ソースとしてそれを使用することIServiceLocator
を意味します。ServiceLocator
編集:
OK、人々は「全脂肪でクリームを惜しまない」という答えを求めています. どうぞ!
ServiceLocator
基本的にシェルです。Service locator のコードは次のとおりです。
public static class ServiceLocator
{
private static ServiceLocatorProvider currentProvider;
public static IServiceLocator Current
{
get
{
return ServiceLocator.currentProvider();
}
}
public static void SetLocatorProvider(ServiceLocatorProvider newProvider)
{
ServiceLocator.currentProvider = newProvider;
}
}
うん、それだけです。
なにServiceLocatorProvider
?を実装するオブジェクトを返すデリゲートですIServiceLocator
。
SimpleIoc
実装しIServiceLocator
ます。そのため、次のようにします。
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
SimpleIoc
オブジェクトを に入れますServiceLocator
。呼び出すServiceLocator.Current
かSimpleIoc.Default
、同じオブジェクト インスタンスを返すかどうかにかかわらず、これらのいずれかを使用できるようになりました。
それで、違いはありますか
userToken = SimpleIoc.Default.GetInstance();
mainVM = ServiceLocator.Current.GetInstance();
?
いいえ。なし。どちらも の実装である静的プロパティを公開するシングルトンですIServiceLocator
。上記のように、IServiceLocator
呼び出しに関係なく実装するオブジェクトの同じインスタンスを返しています。
ServiceLocator.Current.GetInstance()
ではなくユーザーにしたい唯一の理由SimpleIoc.Default.GetInstance()
は、将来のある時点で DI コンテナーを変更する可能性があり、 を使用する場合ServiceLocator
はコードを変更する必要がないからです。