5

autofacデコレータサポート機能をシナリオに適用しようとしていますが、成功しません。私の場合、登録に名前が正しく割り当てられていないようです。

スキャンしたアセンブリタイプを名前で登録して、後で開いているジェネリックデコレータキーで使用できるようにする方法はありますか?

それとも私は完全に間違っていて、ここで不適切なことをしていますか?

builder.RegisterAssemblyTypes(typeof(IAggregateRepositoryAssembly).Assembly)
    .AsClosedTypesOf(typeof(IAggregateViewRepository<>)) //here I need name, probably
    .Named("view-implementor", typeof(IAggregateViewRepository<>))
    .SingleInstance();

builder.RegisterGenericDecorator(typeof(CachedAggregateViewRepository<>),
    typeof(IAggregateViewRepository<>), fromKey: "view-implementor");
4

2 に答える 2

13

これは、Visual Studioの前ではないため、過負荷の解決が正確に正しくない可能性があるための試みです。

builder.RegisterAssemblyTypes(typeof(IAggregateRepositoryAssembly).Assembly)
    .As(t => t.GetInterfaces()
              .Where(i => i.IsClosedTypeOf(typeof(IAggregateViewRepository<>))
              .Select(i => new KeyedService("view-implementor", i))
              .Cast<Service>())
    .SingleInstance();
  • Named()は単なる構文糖衣でKeyed()あり、コンポーネントをKeyedService
  • As()を受け入れるFunc<Type, IEnumerable<Service>>

また、次のものが必要になります。

using Autofac;
using Autofac.Core;
于 2011-11-16T03:51:18.937 に答える
3

登録コードをクリーンアップする場合は、次の追加の拡張メソッドを定義することもできます(非常に冗長で、他のオーバーロードのautofacソースに基づいていますが、一度だけ定義する必要があります)。

using Autofac;
using Autofac.Builder;
using Autofac.Core;
using Autofac.Features.Scanning;

public static class AutoFacExtensions
{
    public static IRegistrationBuilder<TLimit, TScanningActivatorData, TRegistrationStyle>
        AsClosedTypesOf<TLimit, TScanningActivatorData, TRegistrationStyle>(
            this IRegistrationBuilder<TLimit, TScanningActivatorData, TRegistrationStyle> registration,
            Type openGenericServiceType,
            object key)
        where TScanningActivatorData : ScanningActivatorData
    {
        if (openGenericServiceType == null) throw new ArgumentNullException("openGenericServiceType");

        return registration.As(t => 
            new[] { t }
            .Concat(t.GetInterfaces())
            .Where(i => i.IsClosedTypeOf(openGenericServiceType))
            .Select(i => new KeyedService(key, i)));
    }
} 

それはあなたが単にこれをすることを可能にするでしょう:

builder.RegisterAssemblyTypes(typeof(IAggregateRepositoryAssembly).Assembly)
    .AsClosedTypesOf(typeof(IAggregateViewRepository<>), "view-implementor")
    .SingleInstance();
于 2013-09-19T23:54:45.183 に答える