9

私はWindows8用のMVVMLightのバージョン4を使用しています。SimpleIOCが含まれています。さまざまな例で、SimpleIocに基づいてオブジェクトを要求するコードを目にすることがあります...そしてServiceLocatorに基づいていることもあります...

例は次のとおりです。

userToken = SimpleIoc.Default.GetInstance();

mainVM = ServiceLocator.Current.GetInstance();

SimpleIoc.Default.GetInstanceとServiceLocator.Current.GetInstanceの使用の違いは何ですか?

違いがない場合、ServiceLocatorを使用すると、使用するIOCライブラリについて考えを変えることができますか?ServiceLocatorは、SimpleIocに満足している場合は関係のない、追加の抽象化レイヤーを提供するだけですか。または、ServiceLocatorは、IOCの初心者には明らかではない他の便利な魔法を実行しますか?

洞察力をありがとう!

4

2 に答える 2

9

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.CurrentSimpleIoc.Default、同じオブジェクト インスタンスを返すかどうかにかかわらず、これらのいずれかを使用できるようになりました。

それで、違いはありますか

userToken = SimpleIoc.Default.GetInstance();

mainVM = ServiceLocator.Current.GetInstance();

?

いいえ。なし。どちらも の実装である静的プロパティを公開するシングルトンですIServiceLocator。上記のように、IServiceLocator呼び出しに関係なく実装するオブジェクトの同じインスタンスを返しています。

ServiceLocator.Current.GetInstance()ではなくユーザーにしたい唯一の理由SimpleIoc.Default.GetInstance()は、将来のある時点で DI コンテナーを変更する可能性があり、 を使用する場合ServiceLocatorはコードを変更する必要がないからです。

于 2013-01-02T14:41:22.647 に答える