我是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<IEmail, Email>(
new InjectionFactory(c => new Email(
"To Name",
"to@email.com")));
var email = container.Resolve<IEmail>();
container.RegisterType<OperationEntity>(
"email", new ContainerControlledLifetimeManager(),
new InjectionConstructor(email));
}
答案 0 :(得分:43)
首先,您需要一个合适的lifetime manager ContainerControlledLifetimeManager
用于单身人士。
对于自定义初始化,您可以使用InjectionFactory
这使您可以编写初始化实体的任何代码。
Edit1:这应该有帮助
public static void Register(IUnityContainer container)
{
container
.RegisterType<IEmail, Email>(
new ContainerControlledLifetimeManager(),
new InjectionFactory(c => new Email(
"To Name",
"to@email.com")));
}
然后
var opEntity = container.Resolve<OperationEntity>();
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 );
答案 1 :(得分:13)
您可以使用:
container.RegisterType<IEmail, Email>(new ContainerControlledLifetimeManager());
答案 2 :(得分:7)
如果IEmail是一个没有依赖关系的单例(只是自定义参数),你可以自己修改它:
container.RegisterInstance<IEmail>(new Email("To Name", "to@email.com"));
这会将提供的实例注册为容器的单例。
然后你就解决了这个问题:
container.Resolve<OperationEntity>();
由于您正在解决具体类型,因此无需注册。尽管如此,如果您希望该服务也是单例,您可以使用ContainerControlledLifetimeManager注册它,然后所有要解析的调用(或将其作为依赖项注入另一个类时)将返回相同的实例:
container.RegisterType<OperationEntity>(new ContainerControlledLifetimeManager());
答案 3 :(得分:0)
例如,您可以使用以下代码:
public class example : MonoBehaviour
{
public static example instance;
public void Start()
{
(!instance)
instance = this;
}
}
答案 4 :(得分:0)
您可以实现自己的单例类并从它扩展任何类。
public class MyClass : MonoBehaviour {
private static MyClass _instance;
public static MyClass Instance { get { return _instance; } }
private void Awake()
{
if (_instance != null && _instance != this)
{
Destroy(this.gameObject);
} else {
_instance = this;
}
}
}