1

プロジェクトのDIコンテナを調査します。現在、Autofac と Castle Windsor のどちらかを選択しています。私たちにとって非常に重要なことがあります: Autofac の強力な型登録です。

例:

public interface ITestAutofac
{        
}

public class NotDerivedFrom
{        
}

ウィンザーについては、次のように書くことができます -

var cont = new WindsorContainer();

cont.Register(Component
    .For<ITestAutofac>().ImplementedBy<NotDerivedFrom>());

そして、コンパイル時までに失敗します。Resharper はこれに簡単に役立ちます。

Autofac の場合、次のように書くことができます -

builder.Register(c => new NotDerivedFrom()).As<ITestAutofac>();

var form = container.Resolve<ICustomForm>();

そして、実行時に失敗します。

コンパイル時のチェックを使用して Autofac に型を登録するにはどうすればよいですか?

4

2 に答える 2

4
builder.Register<NotDerivedFrom>().As<ITestAutofac>()

Autofac を使用すると、これは実行時に失敗しますが、呼び出すと発生しますが、これbuilder.Build()について考えるとそれほど悪くはありません。私は同意します。コンパイル時のサポートほど優れているわけではありませんが、を呼び出す単体テストを見つけることができますbuilder.Build()。とにかく、ほとんどの DI 構成エラーはコンパイラーによって決してキャッチされないことを忘れないでください。すべての構成エラーを見つけるには、コンテナー、検証可能な構成、およびいくつかの単体テストが必要です。

コンパイル時のチェックを使用して Autofac に型を登録するにはどうすればよいですか?

必要に応じて、コンパイル時のチェックを追加する簡単な拡張メソッドを作成できます。

public static void Register<TService, TImplementation>(
    this ContainerBuilder builder)
    // Note the generic type constraints here
    where TImplementation: class, TService
    where TService: class
{
    builder.Register<TImplementation>().As<TService>();
}

これにより、次のように元の登録を行うことができます。

build.Register<ITestAutofac, NotDerivedFrom>();

コンパイル時に失敗します。

于 2012-12-18T14:14:16.260 に答える