it-swarm.com.de

Unity Singleton Code

Ich bin neu in nity und versuche, eine Unity-Logik zu schreiben, die eine Singleton-Instanz des Email-Objekts initialisiert und registriert/auflöst, sodass sie für mehrere andere Objekte verwendet werden kann. Ein Beispiel unten ist OperationEntity .

Wenn es registriert ist, füllt es das Email-Singleton mit einigen Werten aus einer Konfigurationsdatei. Wenn eine Instanz von OperationEntity erstellt wird (in meinem Fall wird sie deserialisiert), verwendet es dasselbe Email-Singleton. Meine Client-Logik muss also nur OperationEntity deserialisieren und PerformAction () aufrufen - mit der von Unity betreuten E-Mail-Instanz.

public interface IEmail
{
    string FromName { get; set; }
    string FromEmailAddress { get; set; }
}

public class Email : IEmail
{
    public string FromName { get; set; }
    public string FromEmailAddress { get; set; }

    public Email(string fromName, string fromEmailAddress)
    {
        FromName = fromName;
        FromEmailAddress = fromEmailAddress;
    }
}

public class OperationEntity
{
    private readonly IEmail _email;

    public int OperationId { get; set; }
    public string OperationName { get; set; }
    public string ToAddress { get; set; }

    public OperationEntity(IEmail email)
    {
        _email = email;
    }

    public void PerformAction()
    {
        _email.ToAddress = ToAddress;
        _email.Body = "Some email body";
        _email.Deliver();
    }
}

Jede Hilfe wäre willkommen, um diesen Unity-Code zum Laufen zu bringen

    public static void Register(IUnityContainer container)
    {
        container
            .RegisterType<IEmail, Email>(
            new InjectionFactory(c => new Email(
                "To Name", 
                "[email protected]")));

        var email = container.Resolve<IEmail>();  

        container.RegisterType<OperationEntity>(
            "email", new ContainerControlledLifetimeManager(),
            new InjectionConstructor(email));
    }
24
Bern

Zunächst benötigen Sie einen richtigen Lebenszeit-Manager der ContainerControlledLifetimeManager ist für Singletons.

Für die benutzerdefinierte Initialisierung könnten Sie wahrscheinlich InjectionFactory verwenden

Auf diese Weise können Sie jeden Code schreiben, der die Entität initialisiert.

Edit1: das sollte helfen

public static void Register(IUnityContainer container)
{
    container
        .RegisterType<IEmail, Email>(
        new ContainerControlledLifetimeManager(),
        new InjectionFactory(c => new Email(
            "To Name", 
            "[email protected]")));
}

und dann

var opEntity = container.Resolve<OperationEntity>();

Edit2: Um die Serialisierung zu unterstützen, müssen Sie nach der Deserialisierung die Abhängigkeiten neu erstellen:

public class OperationEntity
{
   // make it public and mark as dependency   
   [Dependency]
   public IEmail _email { get; set;}

}

und dann

OperationEntity entity = somehowdeserializeit;

// let unity rebuild your dependencies
container.BuildUp( entity );
44
Wiktor Zychla

Du könntest benutzen:

container.RegisterType<IEmail, Email>(new ContainerControlledLifetimeManager());
13
aquaraga

Wenn IEmail ein Singleton ohne Abhängigkeiten ist (nur benutzerdefinierte Argumente), können Sie es selbst neu erstellen:

container.RegisterInstance<IEmail>(new Email("To Name", "[email protected]"));

Dadurch wird die bereitgestellte Instanz als Singleton für den Container registriert.

Dann lösen Sie einfach den Dienst:

container.Resolve<OperationEntity>();

Und da Sie einen konkreten Typ auflösen, ist keine Registrierung erforderlich. Wenn Sie jedoch möchten, dass dieser Service auch ein Singleton ist, können Sie ihn mit ContainerControlledLifetimeManager registrieren. Anschließend geben alle zu lösenden Aufrufe (oder das Injizieren als Abhängigkeit zu einer anderen Klasse) dieselbe Instanz zurück:

container.RegisterType<OperationEntity>(new ContainerControlledLifetimeManager());
7