webentwicklung-frage-antwort-db.com.de

Autofac-Register Montagetypen

In Castle habe ich folgende Schritte unternommen, um Typen aus einer anderen Assembly zu registrieren:

Classes.FromAssemblyNamed("MyServer.DAL")
       .Where(type => type.Name.EndsWith("Repository"))
       .WithServiceAllInterfaces()
       .LifestylePerWebRequest(),

In Autofac ändere ich den obigen Code wie folgt:

builder.RegisterAssemblyTypes(AppDomain.CurrentDomain.GetAssemblies())
       .Where(t => t.Name.EndsWith("Repository"))
       .InstancePerRequest();

Ist es richtig?

17

Dies ist der richtige Weg:

builder.RegisterAssemblyTypes(AppDomain.CurrentDomain.GetAssemblies())
       .Where(t => t.Name.EndsWith("Repository"))
       .AsImplementedInterfaces()
       .InstancePerRequest();
23

Für UWP ist der richtige Weg etwas zu ändern:

   var assemblyType = typeof(MyCustomAssemblyType).GetTypeInfo();

   builder.RegisterAssemblyTypes(assemblyType.Assembly)
   .Where(t => t.Name.EndsWith("Repository"))
   .AsImplementedInterfaces()
   .InstancePerRequest();

Für jede Assembly haben Sie einen einzelnen Typ, der Assembly gehört, und rufen Sie den Link der Assembly ab. Dann füttere den Builder diesen Link. Wiederholen.

3
Ingerdev

Manchmal gibt AppDomain.CurrentDomain.GetAssemblies keine Assemblys abhängiger Projekte zurück. Detaillierte Erklärung hier nterschied zwischen AppDomain.GetAssemblies und BuildManager.GetReferencedAssemblies

In diesen Fällen sollten wir diese Projektassemblys einzeln mit einer beliebigen Klasse im Projekt abrufen und ihre Typen registrieren.

var webAssembly = Assembly.GetExecutingAssembly();
var repoAssembly = Assembly.GetAssembly(typeof(SampleRepository)); // Assuming SampleRepository is within the Repository project
builder.RegisterAssemblyTypes(webAssembly, repoAssembly)
            .AsImplementedInterfaces();          
0

Sie können die Prädikatüberladung von As verwenden! Sie können alle Schnittstellen mit GetInterfaces aus den angegebenen Typen abrufen, die mit "Repository" enden, und dann die erste Schnittstelle auswählen, die sie implementieren, und sie registrieren.

var Assembly = Assembly.GetExecutingAssembly();
ContainerBuilder builder = new ContainerBuilder();

builder.RegisterAssemblyTypes(Assembly)
    .Where(t => t.Name.EndsWith("Repository"))
    .As(t => t.GetInterfaces()[0]);
0
Shahar Shokrani