Здравствуйте еще раз 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 думаю это может быть одна из двух вещей:
Мне не хватает чего-то из файла конфигурации, связанного с общими типами и службами.
Я неправильно назвал что-то IE, имя сборки.
Я рассматривал имя сборки как проект, в котором содержится элемент, другими словами, я ни разу не использовал <solution name>.<project name>.<item folder>.<item name>
, а просто начал на уровне проекта ...Я предполагаю, что любой параметр конфигурации будет знать, из какого решения он вызывается.
Спасибо за любую помощь, которую вы можете оказать по этому вопросу.