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はコードを変更する必要がないからです。