Может ли Unity Framework создать экземпляр класса в другом пространстве имен, чем данный интерфейс? - PullRequest
2 голосов
/ 02 апреля 2011

У меня есть интерфейс:

namespace IF.Model
{
    public interface IAllocationGroupRepository
    {
    }
}

и класс, который реализует этот интерфейс:

using IF.Model;
namespace IF.Repository
{
    public class AllocationGroupRepository : IAllocationGroupRepository
    {
    }
}

В вызове Unity Framework я могу .RegisterType () в коде дляоба из них:

 IUnityContainer container = new UnityContainer();
 container.RegisterType<IAllocationItemRepository, AllocationItemRepository>();
 IAllocationItemRepository _allocationItemRepository = container.Resolve<IAllocationItemRepository>();

и .Resolve () работают и дают мне новый объект AllocationItemRepository.

НО, когда я пытаюсь вызвать Resolve, и отображение живет в app.configфайл, я получаю эту ошибку:

"Текущий тип, IF.Model.IAllocationItemRepository, является интерфейсом и не может быть создан. Вам не хватает отображения типов?"

Вот что мойФайл app.config выглядит следующим образом:

    <unity>
        <containers>
            <container>
                <types>
                    <type
                        type="IF.Model.IAllocationGroupRepository, IF.Model"
                        mapTo="IF.Repository.AllocationGroupRepository, IF.Repository" />
                </types>
            </container>
        </containers>
    </unity>

. Вот как выглядит код, пытаясь вызвать .Resolve () с использованием содержимого файла App.config:

IUnityContainer container = new UnityContainer();
UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity");
section.Containers.Default.Configure(container);
IAllocationItemRepository _allocationItemRepository = container.Resolve<IAllocationItemRepository>();

Как видите, это довольно простые вещи.Учитывая интерфейс, разрешите его классу.Он работает, когда делает это встроенным, но терпит неудачу при попытке сделать это из файла app.config.

Что мне здесь не хватает?

Спасибо, Майк

Ответы [ 2 ]

0 голосов
/ 15 ноября 2017

Я предполагаю, что у вас есть ссылка на единство, тогда вам нужно определить имя раздела и его библиотеку.вот так:

<?xml version="1.0"?>
<configuration>
  <configSections>
 <section name="mySectionName" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration"/>
  </configSections>
  <mySectionName>
    <typeAliases>
     ...
0 голосов
/ 02 апреля 2011

Попробуйте использовать псевдонимы, которые вызывают пространство имен, в качестве одного из параметров.

<unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
    <alias alias="IAllocationGroupRepository" type="IF.Model.IAllocationGroupRepository, IF.Model, Version=1.0.0.0, Culture=neutral"/>
    <alias alias="AllocationGroupRepository"  type="IF.Repository.AllocationGroupRepository, IF.Repository, Version=1.0.0.0, Culture=neutral"/>

    <container>
        <register type="IAllocationGroupRepository" mapTo="AllocationGroupRepository"/>
    </container>
</unity>

Однако, почему вы помещаете свои интерфейсы репозитория в пространство имен вашей модели? Будете ли вы, как разработчик, впервые изучающий этот код, ожидать найти интерфейс IRepository в пространстве имен Model или в пространстве имен Repository?

...