3

現在、会社で Autofac をテストしています。

次のルールが必要です。

  1. インターフェースが 1 回だけ実装されている場合は、builder.RegisterAssemblyTypes を使用して自動的に追加します (以下を参照)。

  2. それ以外の場合は、どの実装が「デフォルト」の実装であるかを決定するルールを手動で記述する必要があります。

次のコードがあります。

var builder = new ContainerBuilder();
builder.RegisterAssemblyTypes(Assembly
    .Load("Lunch.Service")).As(t => t.GetInterfaces()[0]);
builder.RegisterType<ConsoleLoggerService>()
    .As<ILoggerService>().SingleInstance();
builder.RegisterModule(new DestinationModule());
builder.RegisterType<TransportationService>()
    .As<ITransportationService>().PropertiesAutowired();

現在、それは機能していますが、最初の実装がどれであるかを決定し、それを自動的に作成します。これを手動プロセスにして、「ルール」を手動で作成しないとエラーがスローされるようにしたいと考えています。これは可能ですか?

4

1 に答える 1

1

次のようなことができます。

cb.RegisterAssemblyTypes(assembly).Where(type =>
{
    var implementations = type.GetInterfaces();

    if (implementations.Length > 0)
    {
        var iface = implementations[0];

        var implementers =
            from t in assembly.GetTypes()
            where t.GetInterfaces().Contains(iface)
            select t;

        return implementers.Count() == 1;
    }

    return false;
})
.As(t => t.GetInterfaces()[0]);

これにより、単一の実装者のみが存在するすべての実装が登録され、複数の実装を持つインターフェイスは無視されるため、それらを手動で登録できます。これが何らかの方法で効率的であると主張していないことに注意してください (サービスの数によっては、たとえば、キャッシュの実装者を確認する必要がある場合があります)。

于 2012-05-08T14:32:07.387 に答える