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());
- 每隔06:30 SQL Server查询计数值
- 带有List 的JSON.NET的System.OutOfMemoryException
- 你如何突出TreeViewItem?
- C#::何时使用事件或从事件处理接口派生的对象集合?
- 反序列化为NameValueCollection时,Json.NET 6.0.7中的ArgumentNullException
- IQueryable to ObservableCollection 其中a =匿名类型
- Visual Studio安装项目:将CustomActions / process作为当前用户而不是系统帐户运行
- net462应用程序引用netstandard1.5库时出现“无法加载文件或程序集”错误。 但为什么?
- 以编程方式创建/运行命令文件