Zenjectでなく、あえてService Locatorパターンを使ってみた

C#
Service Locator · Decoupling Patterns · Game Programming Patterns

Service Locator パターンの説明に関しては上記の記事を参考にしてください。

Service Locatorパターンを使うメリットです。

  • 理解しやすい
  • パフォーマンスがよい
スポンサーリンク

理解しやすい

使い方はこんな感じになります。

IServiceDataManager datamgr = Locator._dataMgr;

実装例はこんな感じです

public static class Locator
{
    public static IServiceDataManager _dataMgr { get; set; }
}

一番上のリンク先にあるとおり、ジェネリック型の実装にしてもいいですし、単純な変数アクセスでもよいです。実装がめちゃくちゃわかりやすいですね。

チームで開発しているときは、プログラマのスキルはまちまちです。そんなときでもService Locatorパターンはシンプルなので簡単に実装し使うことができます。

もちろんDependency Injectionパターン自体も単純です。しかし、実際はZenjectのようなDIフレームワークとセットで使うことがほとんどです(そうじゃないと依存関係を手動で解決するはめになり手間がかかります

そしてZenjectをフル活用する学習コストはService Locatorパターンに比べとても高いです。

パフォーマンスがよい

実装を見ればわかる通り、ただのグローバル変数なのでアクセス負荷などはほぼありません

一方Zenjectは遅いです。メモリ消費も多いです。

ZenjectのPerformance - Qiita
こんにちは、DI好きですか? 僕は大好きです でも手動で依存関係を注入するのはつらいです… そこでZenjectに自動的に注入してもらいましょう (

まとめ

Zenjectがもてはやされてますが、流行りだからと導入するのは間違いです。チームメンバーのスキルや開発期間、パフォーマンス要求などを天秤にかけ、使いわけていきましょう。

コメント