UnityContainer解决新实例问题

时间:2016-01-06 18:36:28

标签: c# unity-container

我有这个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是一个实体框架抽象...如果我多次加载一个usercontrol,那么存储库在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并且文档说默认它总是返回一个新实例...

所以我不知道为什么它没有像我期望的那样工作。

2 个答案:

答案 0 :(得分:2)

您可以使用注入工厂替换注入构造函数:

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

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

答案 1 :(得分:2)

When is the Unity InjectionConstructor acually run?

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

豫ICP备18024241号-1