繁体   English   中英

在Castle Windsor IoC中注册通用类型和服务

[英]Registering generic types and services with Castle Windsor IoC

您好,stackoverflowians,

我以为是时候学习了如何使用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. 我已经错误地命名了IE的程序集名称。

我已经将程序集名称视为包含该项目的项目,换句话说,我从未使用过<solution name>.<project name>.<item folder>.<item name>而只是从项目开始级别...我假设任何配置选项都将知道从中调用什么解决方案。

感谢您在这个问题上可能给予的帮助。

程序集名称可以在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" /> 

但是我同意其他评论者的观点,最好以代码形式进行注册。 您不必使用冗长的类型语法,就可以对类型进行编译器检查。 但是,有一些缺点:很难确定您是否有未使用的类型,因为注册调用算作使用该类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM