你好再次stackoverflowians,向Castle Windsor注册一般类型和服务IoC
我认为是时候了解了如何使用DI框架。我听说过很多关于温莎城堡的好消息,所以我决定采取这种做法。现在有很多关于如何使用它的教程,但是,我无法找到关于泛型所涉及的操作的很多有用信息。这是我的问题。
我有一个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.E程序集名称。
我已经治疗程序集名称作为项目包含在内,换句话说项目,在任何时候都我用<solution name>.<project name>.<item folder>.<item name>
但只是在项目层面开始...我认为任何配置选项会知道它被调用的是什么解决方案。
谢谢你对这个问题可能给予的任何帮助。
为什么使用XML进行配置而不是代码? http://stw.castleproject.org/Windsor.Three-Calls-Pattern.ashx – 2010-08-02 10:06:11
“让我们将此配置放在代码的外部,这样我们就可以拥有更多的灵活性,并且我们可以在不重新编译应用程序的情况下进行更改。” - Castle Windsor入门指南的建议。 – user407356 2010-08-02 13:15:38
而点击该链接后,你发布我看到: 回报新WindsorContainer() .Install(Configuration.FromAppConfig(), FromAssembly.This() 其实从定义组件的App.config调用配置的代码吗。我认为这意味着这个网站也建议你通过xml注册组件。 – user407356 2010-08-02 13:19:54