Immagino che non ci sia modo di fare qualcosa di simile a quanto segue con Autofac, in modo da iniettare una serie enumerabile di tipi generici aperti? I vari tipi di handle hanno dipendenze, altrimenti li svilupperei solo dinamicamente.autofac Risolvi tutti i tipi di tipo generico aperto?
class EventOne : IEvent {...}
class EventTwo : IEvent {...}
class EventThree : IEvent {...}
interface IHandleEvent<T> where T : IEvent {...}
class HandleEventOne : IHandleEvent<EventOne> {...}
class HandleEventTwo : IHandleEvent<EventTwo> {...}
class HandleEventThree : IHandleEvent<EventThree> {...}
builder.RegisterAssemblyTypes(myAssembies).AsClosedTypesOf(typeof(IHandleEvent<>));
builder.RegisterType<AService>().As<IAService>();
class AService : IAService
{
public AService(IEnumerable<IHandleEvent<IEvent>> handles)
{...}
}
'IEnumerable>' avrebbe bisogno di essere risolto esattamente 1 tipo concreto . Se si dispone di un tipo che può creare dinamicamente se stesso (vedere Schema generatore), è possibile definirlo e registrarlo con AutoFac come registrazione per "IEnumerable >". È inoltre possibile iniettare il contenitore DI in questo tipo se è necessario recuperare informazioni aggiuntive per crearlo. In breve, penso che tu abbia bisogno di uno schema costruttore o fabbrica per risolvere la tua istanza 'IEnumerable >'. –
Igor
Grazie. Ho dato un'occhiata alle fabbriche delegate autofac doc. Sembra che in questo caso il contenitore venga iniettato in fabbrica per risolvere i vari tipi di IHandleEvent <>. – Suedeuno
Provare a cambiare il tuo 'IHandleEvent' a 'IHandleEvent '. Autofac ha qualche supporto per la varianza e potrebbe raccogliere automaticamente le registrazioni quando lo fai. Ma dimentico sempre che Autofac supporta la covarianza o la contravarianza, quindi dovrai provarlo. –
Steven