Sono un po 'nuovo in DDD e sopporto me se la mia comprensione sembra lontana.
La mia domanda riguarda la soluzione di Udi agli eventi del dominio, in particolare la classe DomainEvents
(vedi codice sotto)
Un estratto dal codice di Udi. Vive il modello di dominio come una classe statica.
public static class DomainEvents
{
[ThreadStatic] //so that each thread has its own callbacks
private static List<Delegate> actions;
public static IContainer Container { get; set; } //as before
//Registers a callback for the given domain event
public static void Register<T>(Action<T> callback) where T : IDomainEvent
{
if (actions == null)
actions = new List<Delegate>();
actions.Add(callback);
}
//Clears callbacks passed to Register on the current thread
public static void ClearCallbacks ()
{
actions = null;
}
//Raises the given domain event
public static void Raise<T>(T args) where T : IDomainEvent
{
if (Container != null)
foreach(var handler in Container.ResolveAll<Handles<T>>())
handler.Handle(args);
if (actions != null)
foreach (var action in actions)
if (action is Action<T>)
((Action<T>)action)(args);
}
}
In base al codice precedente, affinché DomainEvents
venga utilizzato dal modello di dominio, è necessario che entrambi si trovino nello stesso assembly. Che rende corretta la parte DomainEvents
del modello di dominio? (Potrei sbagliarmi qui)
Quindi la mia domanda è: DomainEvents
interrompe la regola "lingua ubiquitaria di DDD" ? Perché la sua implementazione non riguarda alcun dominio.
La mia altra preoccupazione è che il membro statico IContainer
crea una dipendenza da ioc-container nel modello di dominio. Anche se non sono sicuro che il% co_de di Udi sia un'interfaccia o un vero contenitore IoC.
La mia seconda domanda è: Cos'è questo IContainer
nella classe IContainer
? Se è veramente un contenitore IoC, allora non infrange la regola di "DDD dovrebbe non hai un'infrastruttura nel dominio "? La mia comprensione è corretta sul fatto che un contenitore IoC sia considerato un'infrastruttura? (Per favore correggimi se sbaglio)
Se potresti trovare qualcosa di confuso, per favore dillo.
Modifica
Ho costruito i miei progetti in cui il modello di dominio è separato sul proprio assembly (io chiamo questo livello aziendale) senza alcun riferimento a nessun componente dell'infrastruttura. Vedi architettura cipolla .
Ora voglio incorporare il pattern degli eventi del dominio. Ma così facendo mi costringe ad aggiungere componenti di infrastruttura al mio livello aziendale. I componenti sono DomainEvents
e un framework IoC solo per soddisfare DomainEvents
, entrambi non hanno alcuna relazione con il dominio.
L'idea di DDD non riguarda la separazione dell'infrastruttura dal dominio?
Ora interpreterò il programmatore pragmatico, volevo solo sapere che è generalmente giusto farlo? ci sono alternative? Cosa ne pensi di questo approccio? Mi sto perdendo qualcosa di essenziale qui?