Wie registriere ich Typen, die einen anderen registrierten Typ als Parameter und auch einfache Typen (wie eine Ganzzahl) annehmen?SimpleInjector ctor injection mix registrierte Typen und einfache Werte
public interface IDeviceManager
{
// implementation omitted.
}
public class DeviceManager : IDeviceManager
{
public DeviceManager(IDeviceConfigRepository configRepo, int cacheTimeout)
{
// implementation omitted
}
}
ich für die IDeviceConfigRepository
einen Container Registrierung haben. Das ist ok. Aber wie erstelle ich eine Instanz von DeviceManager
mit der konfigurierten Abhängigkeit und übergebe eine Ganzzahl meiner Wahl im Kompositionswurzel?
Ich dachte über die Schaffung einer Fabrik nach.
public class DeviceManagerFactory : IDeviceManagerFactory
{
private readonly Container _container;
public DeviceManagerFactory(Container container)
{
_container = container;
}
public DeviceManager Create(int minutes)
{
var configRepo = _container.GetInstance<IDeviceConfigurationRepository>();
return new DeviceManager(configRepo, minutes);
}
}
Das ist ziemlich einfach.
Allerdings habe ich jetzt keine Registrierung für DeviceManager welches ist der Typ, den ich letztlich brauche. Soll ich diese Abhängigkeiten stattdessen zur Fabrik wechseln?
public class ExampleClassUsingDeviceManager
{
private readonly DeviceManager _deviceManager;
public ExampleClassUsingDeviceManager(DeviceManager deviceManager, ...)
{
_deviceManage = deviceManager;
}
// actions...
}
Damit dies funktioniert und zirkuläre Abhängigkeiten zu vermeiden, würde ich wahrscheinlich das Werk von dem „Anwendung“ Projekt verschieben muß (im Gegensatz zu Klassenbibliotheken gegen), wo die Zusammensetzung Wurzel zu dem Projekt ist, wo die Devicemanager implementiert werden .
Ist das OK? Es würde natürlich bedeuten, um den Container herumzugehen.
Irgendwelche anderen Lösungen zu diesem?
EDIT Im gleichen Projekt für andere Arten Ich bin mit parameter objects Konfiguration in mein Objektgraphen zu injizieren. Das funktioniert OK, da ich nur eine Klasseninstanz pro Parameterobjekttyp habe. Wenn ich verschiedene Parameterobjektinstanzen (zB MongoDbRepositoryOptions
) in verschiedene Klasseninstanzen einfügen müsste (zum Beispiel MongoDbRepository
), müsste ich irgendeine Art von benannter Registrierung verwenden - was SimpleInjector nicht unterstützt. Obwohl ich nur eine ganze Zahl habe, würde das Parameter Objektmuster mein Problem lösen. Aber ich bin nicht allzu glücklich über dieses Muster und weiß, dass es bricht, sobald ich mehrere Instanzen der konsumierenden Klasse (d. H. MongoDbRepository) habe.
Beispiel:
MongoDbRepositoryOptions options = new MongoDbRepositoryOptions();
MongoDbRepositoryOptions.CollectionName = "config";
MongoDbRepositoryOptions.ConnectionString = "mongodb://localhost:27017";
MongoDbRepositoryOptions.DatabaseName = "dev";
container.RegisterSingleton<MongoDbRepositoryOptions>(options);
container.RegisterSingleton<IDeviceConfigurationRepository, MongoDbRepository>();
Ich bin gespannt zu hören, wie Sie mit Konfigurationen am besten umgehen Kompositions Wurzel getan.
Ich empfehle Steven (Autor von SimpleInjector) ausgezeichneten Artikel über die Injektion von Laufzeitdaten zu lesen: https://cuttingedge.it/blogs/steven/pivot/entry.php?id=99 –