4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

SimpleInjectorで不要なインスタンス生成を抑止する

4
Last updated at Posted at 2020-09-20

.NETにはSimpleInjectorという非常に軽量でよくできたDIコンテナがあります。

私はこれを多用しているのですが、その際にインスタンスを1度生成したつもりが複数生成される事象に、悩まされることがありました。システムで一つしか生成しないインスタンスで、そのインスタンス生成時にやや重たい処理をしたかったのですが、実際には2回実行されていました。

SimpleInjectorは次のように利用します。

var container = new Container();
container.Register<Foo>();
container.Register<Bar>();
container.Verify();

var foo = container.GetInstance<Foo>();

SimpleInjectorでは依存性を登録した後、Verifyで登録が不足しているオブジェクトがないかベリファイすることができますが、実はこの時内部でインスタンスが生成されているために、前述のようなインスタンスの複数生成が行われます。

ではVerifyを外せばいいかというと、つぎの二つの問題があります。

  1. 開発時はVerifyしておかないと、不具合の発見が遅れる
  2. Verifyを明示的に呼ばなくても、GetInstanceした際に、Verifyしていなければ自動的に実行される

そのため、つぎのように実装するとよいのではないかと思います。

            var container = new Container();
            container.Register<Foo>();
            container.Register<Bar>();
# if DEBUG
            container.Verify();
# else
            container.Options.EnableAutoVerification = false;
# endif

            var foo = container.GetInstance<Foo>();

Debug実行時は明示的にVerifyを呼び出し、そうではない場合は、AutoVerificationを明示的にOFFにします。

これでReleaseビルドされたモジュールでは不要なインスタンス生成が避けられるはずです。

なおコメントでいただきましたが、登録するインスタンスをSingletonとして登録できる場合は、そちらでも回避は可能だと思います。どちらが向いているか、ケースによって検討してみてください。

4
2
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?