Регистрация универсальных типов и услуг с помощью Castle Windsor IoC - PullRequest
2 голосов
/ 01 августа 2010

Здравствуйте еще раз stackoverflowians,

Я подумал, что пришло время научиться использовать DI-фреймворк.Я слышал много хорошего о замке Виндзор, поэтому я решил пойти с этим.Сейчас существует множество учебных пособий о том, как его использовать, однако я не могу найти много полезной информации о том, что делать, когда в дело вступают Generics.Вот моя проблема.

У меня есть BaseDAO

namespace Utilities.DataAccess
{
    public class BaseDAO<T> : IBaseDAO<T>
    {
        public BaseDAO(IConnectionProvider _connectionProvider)
        {
           // Stuff
        }
    }
} 

Я немного новичок в дженериках в этом контексте, и я видел некоторые учебники, в которых есть BaseDAO без описания родовогои просто интерфейс, который он реализует с обобщениями на нем.Я использовал описанный выше способ работы во многих предыдущих проектах (без IoC), и он работал нормально для меня ... в любом случае, вплоть до App.config!

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section
      name="castle"
      type="Castle.Windsor.Configuration.AppDomain.CastleSectionHandler, Castle.Windsor"></section>
  </configSections>

  <castle>
    <components>

      <component
        id="BaseDAO"
        service="Utilities.DataAccess.Interfaces.IBaseDAO`1, Utilities.DataAccess"
        type="Utilities.DataAccess.BaseDAO`1, Utilities.DataAccess" />

      <component
        id="NHibernateConnection"
        service="Utilities.DataAccess.ConnectionProviders.IConnectionProvider, Finchtils"
        type="Utilities.DataAccess.ConnectionProviders.NHibernateConnection" />

      <component
        id="XMLConnection"
        service="Utilities.DataAccess.ConnectionProviders.IConnectionProvider, Finchtils"
        type="Utilities.DataAccess.ConnectionProviders.XMLConnection, Utilities" />
    </components>
  </castle>
</configuration>

Теперь, как некоторые из вас могутна данный момент это служебная библиотека.Я намерен использовать эту сборку для каждого создаваемого проекта, чтобы мне не приходилось писать один и тот же код доступа к данным, который остается одинаковым во всех решениях.Последствия такого, конечно, в том, что я не могу точно сказать Каслу, какой параметр типа я передам BaseDAO, в одном проекте это может быть объект Customer, а в другом - совсем другой.Я читал на других форумах, что это вполне возможно, поскольку, когда вы запрашиваете объект из контейнера, вы можете указать его тип, например:

BaseDAO<Customer> baseDao = container.Resolve<BaseDAO<Customer>>();

Хотя это противоречит моим усилиям по проектированию, я пытался использоватьследующая запись в файле App.config

<component
    id="BaseDAO"
    service="Utilities.DataAccess.Interfaces.IBaseDAO`1[[Utilities.DataInterface.IEntity]], Finchtills.DataAccess"
    type="Utilities.DataAccess.BaseDAO`1[[Utilities.DataInterface.IEntity]], Finchtils.DataAccess" />

Однако это тоже не сработало, в любом случае я получаю следующую ошибку:

Utilities.Testing.DataAccess.Unit.Testing_BaseDAO (TestFixtureSetUp):
System.Exception : The type name Utilities.DataAccess.BaseDAO`1, Utilities.DataAccess could not be located.
  ----> System.IO.FileNotFoundException : Could not load file or assembly 'Utilities.DataAccess' or one of its dependencies. The system cannot find the file specified.

Чтение этой ошибки, I думаю это может быть одна из двух вещей:

  1. Мне не хватает чего-то из файла конфигурации, связанного с общими типами и службами.

  2. Я неправильно назвал что-то IE, имя сборки.

Я рассматривал имя сборки как проект, в котором содержится элемент, другими словами, я ни разу не использовал <solution name>.<project name>.<item folder>.<item name>, а просто начал на уровне проекта ...Я предполагаю, что любой параметр конфигурации будет знать, из какого решения он вызывается.

Спасибо за любую помощь, которую вы можете оказать по этому вопросу.

1 Ответ

1 голос
/ 13 января 2011

Имя сборки можно найти в Visual Studio следующим образом:

  • В обозревателе решений дважды щелкните узел свойств
  • Откройте вкладку Приложения
  • Имя сборки находится в верхнем правом углу

Или, если вы компилируете в командной строке, вы используете аргумент /out.

Также вам нужно указатьсборка для аргументов типа (внутри квадратных скобок).Итак, при условии, что все ваши типы находятся в сборке DataAccess, и что сборка называется (для краткости) «DataAccess»:

<component 
    id="BaseDAO"
    service="Utilities.DataAccess.Interfaces.IBaseDAO`1[[Utilities.DataInterface.IEntity, DataAccess]], DataAccess"
    type="Utilities.DataAccess.BaseDAO`1[[Utilities.DataInterface.IEntity, DataAccess]], DataAccess" /> 

Но я согласен с другими комментаторами, что лучше делать регистрации вкод.Вам не нужно использовать подробный синтаксис типа, например, и вы получаете проверку компилятором ваших типов.Однако есть некоторые недостатки: сложнее определить, есть ли у вас неиспользуемые типы, поскольку регистрационный вызов считается использованием типа.

...