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?
Dies ist der richtige Weg:
builder.RegisterAssemblyTypes(AppDomain.CurrentDomain.GetAssemblies())
.Where(t => t.Name.EndsWith("Repository"))
.AsImplementedInterfaces()
.InstancePerRequest();
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.
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();
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]);