在Unity中,注册单例实例的两种方法之间有什么区别?

时间:2017-05-31 18:28:18

标签: c# singleton unity-container

在Unity中,据我所知,我可以使用以下两个选项来注册单例实例:

        IConfiguration globalConfig = new Configuration();
        container.RegisterInstance<IConfiguration>(globalConfig);

        container.RegisterType<IConfiguration, Configuration>(new ContainerControlledLifetimeManager()); 

这两种方式有什么区别吗?注册单例实例的首选方法是什么?

2 个答案:

答案 0 :(得分:8)

第一种方式注册实例。您必须在执行此操作时创建对象的实例。

第二种方式不是单身人士。对于容器或其任何子容器的任何解决方案,它都是一个单一的容器&#34;。第一次它将永远解决将修复状态&#34;在LifetimeManager

内对象和注册任何进一步的决议

例如,假设您有以下课程:

class AA
{
    public Datetime When { get; set; }
    public AA()
    {
        this.When = Datetime.Now;
    }
}

在第一种情况下,When将在注册之前,在第二种情况下,只要您真正解析该类型/接口,就会出现这种情况。

答案 1 :(得分:1)

在第一种情况下,您注册了一些类型的实例。 因此,此实例的字段和属性已被修改,直到您注册他为止,因此您可以注册一些单身的“状态”。 Hovewer,这是一个非常奇怪的行为,你需要注册单身人士的状态。

在第二种情况下,您注册类型,但不注册某些对象状态。当然,您可以使用特定属性或注入参数来设置新实例的状态。

默认情况下,

IUnityContainer.RegisterInstance 使用 ContainerControlledLifetimeManager ,请参阅Lifetime Managers。你的两个案件完全相同。 Hovewer,两个案例都没有注册单身人士。 我的意思是你可以为IConfiguration注册许多不同的对象:

IConfiguration globalConfig = new Configuration();
IConfiguration localConfig = new Configuration();

container.RegisterInstance<IConfiguration>("globalConfig", globalConfig);
container.RegisterInstance<IConfiguration>("localConfig", localConfig);

...
container.RegisterType<IConfiguration, Configuration>("localConfig", new ContainerControlledLifetimeManager());
container.RegisterType<IConfiguration, Configuration>("globalConfig", new ContainerControlledLifetimeManager());

你得到的对象不匹配registerName不匹配,但得到相同registerName的equals对象:

// This objects does not equal in both cases
IConfiguration globalConfig = container.Resolve<IConfiguration>("globalConfig");
IConfiguration localConfig = container.Resolve<IConfiguration>("localConfig");

....

// This objects equals in both cases
IConfiguration globalConfig1 = container.Resolve<IConfiguration>("globalConfig");
IConfiguration globalConfig2 = container.Resolve<IConfiguration>("globalConfig");

我希望它对你有帮助。