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注册它,然后所有要解析的调用(或将其作为依赖项注入另一个类时)将返回相同的实例:
上述就是C#学习教程:Unity Singleton Code分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
container.RegisterType(new ContainerControlledLifetimeManager());
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1039549.html