Ho un paio di classi in un progetto su cui sto lavorando che registrano solo gestori di eventi.
public class EventLogger
{
public EventLogger(EventRaiser someObject)
{
someObject.EventRaised += logThatEvent;
}
}
Il EventLogger
è in esecuzione o non basato su alcuni controlli dello stato di runtime all'avvio del programma, quindi lo inizializzo in una classe factory:
public class EventLoggerFactory
{
public EventLogger GenerateEventLogger(StatusChecker status, EventRaiser objectToListenTo)
{
if (status.EventLoggerNeeded)
{
return new EventLogger(objectToListenTo);
}
return null; // Spring.NET doesn't let you return null
}
e in Spring.NET config:
<object id="EventLogger" type="MyProject.EventLogger" factory-object="EventLoggerFactory" factory-method="GenerateEventLogger">
<constructor-arg name="status" ref="StatusChecker"/>
<constructor-arg name="objectToListenTo" ref="EventRaiser"/>
</object>
Poiché non posso restituire null
per il mio metodo factory, ho provato quanto segue:
public class EventLogger
{
// Actual implementation elided
private EventLogger(){}
internal static EventLogger DummyInstance
{
get { return new EventLogger(); }
}
}
public class EventLoggerFactory
{
public EventLogger GenerateEventLogger(StatusChecker status, EventRaiser objectToListenTo)
{
if (status.EventLoggerNeeded)
{
return new EventLogger(objectToListenTo);
}
return EventLogger.DummyInstance;
}
Questo è un uso valido del modello Oggetto fittizio? Mi sembra strano dover aggiustare i componenti interni della mia classe per adattarli al contenitore delle dipendenze di iniezione che sto utilizzando, ma non riesco a trovare un altro modo.
(Anche io sto taggando questo spring
perché non riesco a creare un tag spring.net
)