2

你好再次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. 

阅读这个错误,我觉得可能是两两件事之一:

  1. 我从配置文件丢失的东西做类型和服务的泛型。

  2. 我已经错误地命名了一些内容I.E程序集名称。

我已经治疗程序集名称作为项目包含在内,换句话说项目,在任何时候都我用<solution name>.<project name>.<item folder>.<item name>但只是在项目层面开始...我认为任何配置选项会知道它被调用的是什么解决方案。

谢谢你对这个问题可能给予的任何帮助。

+1

为什么使用XML进行配置而不是代码? http://stw.castleproject.org/Windsor.Three-Calls-Pattern.ashx – 2010-08-02 10:06:11

+0

“让我们将此配置放在代码的外部,这样我们就可以拥有更多的灵活性,并且我们可以在不重新编译应用程序的情况下进行更改。” - Castle Windsor入门指南的建议。 – user407356 2010-08-02 13:15:38

+0

而点击该链接后,你发布我看到: 回报新WindsorContainer() .Install(Configuration.FromAppConfig(), FromAssembly.This() 其实从定义组件的App.config调用配置的代码吗。我认为这意味着这个网站也建议你通过xml注册组件。 – user407356 2010-08-02 13:19:54

回答

1

集名称可以在Visual Studio因此,可以发现:

  • 在解决方案资源管理器中,双击属性节点
  • 打开应用程序选项卡
  • 大会名称靠近右上角

或者,如果您在命令行编译,则使用/out参数。

此外,您需要指定类型参数的程序集(在方括号内)。因此,假设你所有的类型都在数据访问组件,并且该组件被称为(为简洁起见)“数据访问”:

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

但我与其他评论者认为,这是更好地做注册代码。你不必使用冗长的类型语法,你可以通过编译器检查你的类型。但是有一些缺点:很难判断你是否有未使用的类型,因为注册调用算作使用类型。

+0

感谢您的示例代码片。 – VIJAY 2012-02-10 12:50:35

相关问题