c# - lifetimemanager - singleton unity
Unity Singleton Code (3)
Podrías usar:
container.RegisterType<IEmail, Email>(new ContainerControlledLifetimeManager());
Soy nuevo en Unity y estoy intentando escribir un poco de lógica de Unity que inicializa y registra / resuelve una instancia de singleton del objeto Email para que pueda usarse con otros objetos, un ejemplo a continuación es OperationEntity.
Entonces, cuando se registra, llena el Singleton de correo electrónico con algunos valores de un archivo de configuración, luego, cada vez que se crea una instancia de OperationEntity (en mi caso, se está deserializando) utiliza el mismo Singleton de correo electrónico. Así que todo lo que la lógica de mi cliente debe hacer es deserializar OperationEntity y llamar a PerformAction (), con la instancia de correo electrónico a cargo de Unity.
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();
}
}
Cualquier ayuda sería apreciada para que este código de Unity funcione.
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));
}
Primero, necesita un administrador de por vida adecuado , el ContainerControlledLifetimeManager
es para singletons.
Para la inicialización personalizada, probablemente podría utilizar InjectionFactory
Esto le permite escribir cualquier código que inicialice la entidad.
Edit1: esto debería ayudar
public static void Register(IUnityContainer container)
{
container
.RegisterType<IEmail, Email>(
new ContainerControlledLifetimeManager(),
new InjectionFactory(c => new Email(
"To Name",
"[email protected]")));
}
y entonces
var opEntity = container.Resolve<OperationEntity>();
Edit2: Para admitir la serialización, tendría que reconstruir las dependencias después de deserializar:
public class OperationEntity
{
// make it public and mark as dependency
[Dependency]
public IEmail _email { get; set;}
}
y entonces
OperationEntity entity = somehowdeserializeit;
// let unity rebuild your dependencies
container.BuildUp( entity );
Si IEmail es un singleton sin dependencias (solo argumentos personalizados), puede hacerlo usted mismo:
container.RegisterInstance<IEmail>(new Email("To Name", "[email protected]"));
Eso registrará la instancia suministrada como un singleton para el contenedor.
Entonces solo resuelves el servicio:
container.Resolve<OperationEntity>();
Y debido a que está resolviendo un tipo concreto, no es necesario registrarse. Sin embargo, si desea que ese servicio también sea un singleton, puede registrarlo utilizando ContainerControlledLifetimeManager y luego todas las llamadas a resolver (o al inyectarlo como una dependencia a otra clase) devolverán la misma instancia:
container.RegisterType<OperationEntity>(new ContainerControlledLifetimeManager());