2016-07-20 4 views
1

War nicht ganz sicher, wie man dies tituliert. Ich habe den folgenden Code:Bessere Möglichkeit, mehrere generische Implementierungen auszudrücken

builder.Register(context => 
{ 
    var bus = context.Resolve<IBus>(); 
    return bus.CreatePublishRequestClient<IGenerateProjectReport, IGenerateReportResult>(MessagingTimeout); 
}).As<IRequestClient<IGenerateProjectReport, IGenerateReportResult>>(); 

builder.Register(context => 
{ 
    var bus = context.Resolve<IBus>(); 
    return bus.CreatePublishRequestClient<IGenerateInstanceReport, IGenerateReportResult>(MessagingTimeout); 
}).As<IRequestClient<IGenerateInstanceReport, IGenerateReportResult>>(); 

builder.Register(context => 
{ 
    var bus = context.Resolve<IBus>(); 
    return bus.CreatePublishRequestClient<IGenerateInternalReport, IGenerateReportResult>(MessagingTimeout); 
}).As<IRequestClient<IGenerateInternalReport, IGenerateReportResult>>(); 

Gibt es einen besseren Weg, dies auszudrücken? Scheint ein wenig überflüssig.

Edit:

Ich kann nicht das Register generische Fähigkeit meines Wissen verwenden, da ich eine Factory-Methode von einem anderen registrierten Dienst verwenden.

+0

Mögliche Duplikat [Register Allgemein Typ mit Autofac] (http://stackoverflow.com/questions/15226536/register-generic-type-with-autofac) – Igor

+0

@Igor Nicht ganz. Ich verwende das in diesem Beitrag beschriebene Muster und meine Implementierung passt nicht ganz, da ich eine Factory-Methode von einem aufgelösten Service anrufe. – chrisdrobison

+0

Könnten Sie Schnittstellenvertrag teilen? Wie viele Registrierungen hast du? Müssen Sie alle Ihre Typen basierend auf einer Typbeschränkung automatisch registrieren? –

Antwort

1

Sie können eine benutzerdefinierte Erweiterungsmethode erstellen Sie Ihre Komponenten registrieren:

Ich weiß nicht, wie Sie Ihre Typen und geben Einschränkungen gestaltet werden, aber so etwas wie dies:

static class XXXRegistrationExtensions 
{ 
    public static IRegistrationBuilder<PublishRequestClient<TReport>, SimpleActivatorData, SingleRegistrationStyle> RegisterXXX<TReport, TReportResult>(this ContainerBuilder builder) 
     where TReport : IXXXReport 
     where TReportResult : IXXXReportResult<TReport> 
    { 
     var registration = builder.Register(context => 
     { 
      var bus = context.Resolve<IBus>(); 
      return bus.CreatePublishRequestClient<TReport, TReportResult>(); 
     }).As<IRequestClient<TReport, TReportResult>>(); 

     return registration; 
    } 
} 

Dann werden Sie sein der Lage, Ihre Typen zu registrieren:

builder.RegisterXXX<IGenerateInternalReport, IGenerateReportResult>(); 
+0

Das macht Sinn, ich habe mich nur gefragt, ob Autofac einen eingebauten Mechanismus hatte, um das zu erleichtern. – chrisdrobison

Verwandte Themen