Wir haben derzeit Code, der etwas wie folgt aussieht, mit einer Fabrik in viele Klassen injiziert wird, die dann die Fabrik aufrufen, um eine Instanz von dem, was sie wollen.Generische Registrierung in Windsor mit UsingFactoryMethod
public class Service
{
public Service(IFactory factory)
{
_car = factory.GetCar<Entity>();
}
}
public class Car : ICar
{
}
public interface IFactory
{
ICar<TEntity> GetCar<TEntity>();
IBoat<TEntity> GetBoat<TEntity>();
}
public class Factory : IFactory
{
ConnectionDetails _connectionDetails;
public Factory(ConnectionDetails connectionDetails)
{
_connectionDetails = connectionDetails;
}
TEntity GetCar<TEntity>()
{
var car = new Car<TEntity>(_connectionDetails);
car.Initialize();
return car;
}
}
Ich hatte gehofft, eine Lösung zu schaffen in der Lage sein, die eine Abhängigkeit direkt für die Anforderung auf dem Car<TEntity>
, ohne dass durch die Fabrik gehen zuerst erlauben würde.
Unten ist ein Beispiel für die Installation für eine einzige TEntity
, aber wie würde ich dies als generische einrichten?
Ich habe versucht, offene Generika zu verwenden, aber ich kann nicht sehen, wie ich den richtigen Rückgabetyp aus .UsingFactoryMethod()
bekommen kann.
Ich weiß, ich kann die RequestedType
aus der CreationContext
, aber ich sehe nicht, wie ich das verwenden, um dieses Problem zu lösen.
public class Installer : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(
Component.For<ICar<TEntity>>().UsingFactoryMethod(
kernel =>
{
var factory = kernel.Resolve<IFactory>();
return factory.GetCar<TEntity>();
}));
}
}
Ich hatte nicht wirklich daran gedacht, das Verhalten dieser Klassen zu ändern, aber das macht Sinn. Ich sollte die Fabrik alle zusammen überspringen können. Ich werde es versuchen. – lxalln
Sie werden feststellen, dass das Skalieren beim Hinzufügen neuer Typen wesentlich einfacher ist, da Sie nicht mehr auf die Änderung der Factory angewiesen sind, um die Erstellungsdetails zu verwalten. –
Das funktioniert jetzt gut, ich hatte gerade nicht an eine Umstrukturierung gedacht. Die Fabrik existierte bereits, ich hatte nicht darüber nachgedacht, sie zu veralten. – lxalln