In ASP.NET Core eines der Dinge, die Sie mit Microsofts Dependency Injection-Framework is bind "open generics" (generische Typen ungebunden auf einen konkreten Typ) tun können, etwa so:Fabrik-Muster mit Öffnen Generics
public void ConfigureServices(IServiceCollection services) {
services.AddSingleton(typeof(IRepository<>), typeof(Repository<>))
}
Sie können auch beschäftigen the factory pattern to hydrate dependencies. Hier ist ein konstruiertes Beispiel:
public interface IFactory<out T> {
T Provide();
}
public void ConfigureServices(IServiceCollection services) {
services.AddTransient(typeof(IFactory<>), typeof(Factory<>));
services.AddSingleton(
typeof(IRepository<Foo>),
p => p.GetRequiredService<IFactory<IRepository<Foo>>().Provide()
);
}
Allerdings habe ich nicht in der Lage gewesen, um herauszufinden, wie die beiden Konzepte miteinander zu kombinieren. Es scheint, als würde es mit so etwas beginnen, aber ich brauche den konkreten Typ, der verwendet wird, um eine Instanz von IRepository<>
zu hydratisieren.
public void ConfigureServices(IServiceCollection services) {
services.AddTransient(typeof(IFactory<>), typeof(Factory<>));
services.AddSingleton(
typeof(IRepository<>),
provider => {
// Say the IServiceProvider is trying to hydrate
// IRepository<Foo> when this lambda is invoked.
// In that case, I need access to a System.Type
// object which is IRepository<Foo>.
// i.e.: repositoryType = typeof(IRepository<Foo>);
// If I had that, I could snag the generic argument
// from IRepository<Foo> and hydrate the factory, like so:
var modelType = repositoryType.GetGenericArguments()[0];
var factoryType = typeof(IFactory<IRepository<>>).MakeGenericType(modelType);
var factory = (IFactory<object>)p.GetRequiredService(factoryType);
return factory.Provide();
}
);
}
Wenn ich versuche, den Func<IServiceProvider, object>
Funktor mit einem offenen Generika zu verwenden, erhalte ich this ArgumentException
mit der Nachricht Open generic service type 'IRepository<T>' requires registering an open generic implementation type.
von der Dotnet CLI. Es kommt nicht einmal zum Lambda.
Ist diese Art der Bindung mit dem Microsoft-Framework für Abhängigkeitsinjektionen möglich?
Was ist der Vorteil von registerin ist g ein Lambda, das eine Fabrik auflöst, die den erforderlichen Service löst? – Steven
Gute Frage. Es leitet die Komplexität für die bedingte Hydratation um. Sie benötigen keine explizite Factory, da das Lambda als eins fungiert (seine Variable wird sogar als "implementationFactory" bezeichnet), aber wenn Sie mehrere Services benötigen, um eine Entscheidung darüber zu treffen, welche Instanz Sie hydratisieren möchten, werden Sie dies tun ein Lambda, das komplex und schwer zu testen ist. Der Blogbeitrag, den ich oben verlinkt habe, hat ein gutes Beispiel: http://dotnetliberty.com/index.php/2016/05/09/asp-net-core-factory-penden-dependency-injection/ – Technetium
hast du jemals ein gutes gefunden dafür antworten? Ich habe das gleiche Problem, aber keine der Antworten hier scheint eine gute Lösung für das Problem zu sein –