Creazione condizionale di oggetti in fase di esecuzione utilizzando Spring.NET

0

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 )

    
posta Harrison Paine 07.03.2016 - 16:43
fonte

1 risposta

1

, questo è un uso molto valido del modello Null Object (o Dummy Object).

Sono d'accordo sul fatto che ci si sente come se si stesse effettivamente adattando al proprio framework, ma molti framework di registrazione effettivamente sostengono questo approccio. Limita la quantità di controlli NULL necessari sull'oggetto di registrazione stesso. Il contenitore .NET DI Castle consiglia in realtà questo modello per l'iniezione basata su proprietà di un logger.

    
risposta data 07.03.2016 - 17:23
fonte

Leggi altre domande sui tag