2016-04-10 12 views
2

Ich versuche, meine Befehlshandler zu dekorieren, und ich versuche, sie in meinem Prozessor aufzulösen.Autofac und generisches Befehlsmuster

registriert ich meinen Befehl wie folgt aus:

builder.RegisterAssemblyTypes(typeof(ICommandProcessor).Assembly) 
    .AsClosedTypesOf(typeof(ICommandHandler<,>)) 
    .AsSelf().AsImplementedInterfaces().Named("implementor", typeof(ICommandHandler<,>)); 

builder.RegisterGenericDecorator(
    typeof(CatchValidationErrorsDecorator<,>), 
    typeof(ICommandHandler<,>), fromKey: "implementor") 
    .AsImplementedInterfaces(); 

Das Problem, das ist, wenn ich nicht das Named Erweiterung verwende, die generische Dekorateur nicht funktioniert. Wenn ich den Namen Erweiterung verwenden, bin ich nicht in der Lage meine Komponenten wie dieses Problem zu beheben:

var handerType = typeof (ICommandHandler<,>) 
    .MakeGenericType(command.GetType(), typeof (TResult)); 
dynamic handler = _container.Resolve(handerType); 

hat jemand eine Idee, wie dieses Problem zu lösen?

Antwort

1

Das hat mir in der Vergangenheit ernsthafte Kopfschmerzen bereitet. Die Registrierung, die es schließlich für mich getan hat, war:

var assembly = typeof(ICommandProcessor).Assembly); 

builder.RegisterAssemblyTypes(assembly).As(type => 
    from interfaceType in type.GetInterfaces() 
    where interfaceType.IsClosedTypeOf(typeof(ICommandHandler<,>)) 
    select new KeyedService("implementor", interfaceType)); 

builder.RegisterGenericDecorator(
    typeof(CatchValidationErrorsDecorator<,>), 
    typeof(ICommandHandler<,>), 
    fromKey: "implementor"); 
+0

Vielen Dank für Ihre Antwort. Das hat den Trick gemacht! Eine weitere Frage, was ist, wenn ich einen Befehl innerhalb von Befehlen verarbeiten muss und nicht möchte, dass der Commandhandler eingerichtet wird, wenn er in einem anderen Befehl ausgelöst wird? – Identity

+0

@Manaus Das rate ich davon ab. Ein Befehl sollte eine atomare Operation sein und der ICommandHandler eine holistische Abstraktion. Sie sollten doppelten Code in Services extrahieren, die Sie in Ihre Handler injizieren. Bedingt durch die Position in der Hierarchie ist das Bedingungs-Handling Ihrer Handler auch bei anderen Containern fehleranfällig und fehleranfällig. – Steven

+0

danke! Das macht Sinn :) – Identity