Unity Singleton Code

我是Unity的新手,我正在尝试编写一些Unity逻辑,它初始化并注册/解析Email对象的单例实例,以便它可以用于其他几个对象,下面的一个例子是OperationEntity。

所以当它注册时,它会使用配置文件中的一些值填充Email单例,然后每当创建一个OperationEntity实例时(在我的情况下它被反序列化)它就会使用相同的Email单例。 所以我的所有客户端逻辑需要做的是反序列化OperationEntity并调用PerformAction() – 使用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(); } } 

在使Unity代码工作时,我们将不胜感激

  public static void Register(IUnityContainer container) { container .RegisterType( new InjectionFactory(c => new Email( "To Name", "to@email.com"))); var email = container.Resolve(); container.RegisterType( "email", new ContainerControlledLifetimeManager(), new InjectionConstructor(email)); } 

首先,您需要一个适当的生命周期管理器 , ContainerControlledLifetimeManager用于单例。

对于自定义初始化,您可能使用InjectionFactory

这允许您编写初始化实体的任何代码。

编辑1:这应该有所帮助

 public static void Register(IUnityContainer container) { container .RegisterType( new ContainerControlledLifetimeManager(), new InjectionFactory(c => new Email( "To Name", "to@email.com"))); } 

然后

 var opEntity = container.Resolve(); 

Edit2:为了支持序列化,您必须在反序列化后重建依赖项:

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

然后

 OperationEntity entity = somehowdeserializeit; // let unity rebuild your dependencies container.BuildUp( entity ); 

你可以使用:

 container.RegisterType(new ContainerControlledLifetimeManager()); 

如果IEmail是一个没有依赖项的单例(只是自定义参数),你可以自己修改它:

 container.RegisterInstance(new Email("To Name", "to@email.com")); 

这会将提供的实例注册为容器的单例。

然后你就解决了这个问题:

 container.Resolve(); 

由于您正在解决具体类型,因此无需注册。 尽管如此,如果您希望该服务也是单例,您可以使用ContainerControlledLifetimeManager注册它,然后所有要解析的调用(或将其作为依赖项注入另一个类时)将返回相同的实例:

 container.RegisterType(new ContainerControlledLifetimeManager());