UnityContainer解决新实例问题

本文关键字:实例 问题 解决 新实例 UnityContainer | 更新日期: 2023-09-27 18:29:09

我有一个IoC类:

public static class IoC
{
    private static IUnityContainer container;
    private static void setupIoC()
    {
        container = new UnityContainer();
        container.RegisterType<MessageContext>(
            new InjectionConstructor(
                 new DatabaseRepository<Message>(new RepositoryConfig() {AutoDetectionEnabled = false})));
    }
    public static T Resolve<T>()
    {
        if (container == null)
        {
            setupIoC();
        }
        return container.Resolve<T>();
    }
}

在我的ViewModel中,我有:

public MessageViewModel()
    : base(Resources.MENU_BAR_COREDATA_MESSAGE)
{
    msgContext = IoC.Resolve<MessageContext>();
}

msgContext是一个实体框架抽象。。。如果我多次加载用户控件,则存储库在DbSet.Local中有一些条目

public MessageViewModel()
    : base(Resources.MENU_BAR_COREDATA_MESSAGE)
{
    msgContext = new MessageContext(new DatabaseRepository<Message>(new RepositoryConfig(){AutoDetectionEnabled = false}));
}

我总是有一个新的msgContext,没有任何DbSet.Local条目等。在我看来,这表明我的IoC在我解决它时没有给我一个新实例。我使用UnityContainer,文档说它总是默认返回一个新示例。。。

所以我不知道为什么它没有像我预期的那样起作用。

UnityContainer解决新实例问题

您可以将注入构造函数替换为注入工厂:

   container.RegisterType<MessageContext>(
        new InjectionFactory( c =>
             new MessageContext(
                   new DatabaseRepository<Message>(
                         new RepositoryConfig(){AutoDetectionEnabled = false} ) ) );

不同之处在于,每次解析实例时都会执行工厂方法。

Unity InjectionConstructor何时实际运行?

我认为new DatabaseRepository在注册期间只调用一次