【问题标题】:Castle Windsor Namespace conflicts温莎城堡命名空间冲突
【发布时间】:2013-05-15 10:28:17
【问题描述】:

假设我在一个名为 Org.Company 的命名空间中工作,并且该命名空间包含 MyClass。 我还导入了一个名为 Company 的命名空间的 nuget,其中一个名为 OtherClass 的类。

所以,当我在 Org.Company 命名空间中工作时,我无法执行以下操作:

Company.OtherClass obj;

因为编译器假定我的实际意思是:

Org.Company.Otherclass obj

不存在的。

所以,据我所知,我实际上必须导入另一个命名空间,而不是使用完全限定名称 using Company;

但是,问题是我需要从 XML 文件(温莎城堡配置文件)引用此 OtherClass,而完全限定名称 Company.OtherClass 不起作用。 有没有解决的办法?更改命名空间名称不是一个可行的选择。

编辑: 这就是我的 Castle Windsor xml 文件中的内容

<using assembly="MyProj, Version=1.0.0.0, Culture=neutral" />
...
<component
  service="Company.IOtherClass"
  type="Company.OtherClass"
  />

我收到以下错误:

{"Could not convert string 'Company.OtherClass' to a type. Make sure assembly containing the type has been loaded into the process, or consider specifying assembly qualified name of the type."}

可能是因为它查看的是 Org.Company 内部,而是在 MyProj 程序集中定义的。

如果有办法添加另一个引用 Nuget 包的 &lt;using /&gt; 语句,我认为可以解决此问题...有没有办法做到这一点?

【问题讨论】:

  • 温莎城堡是否返回任何错误消息?或者您可以在其中使用完全限定名称,包括程序集吗?

标签: c# .net namespaces castle-windsor


【解决方案1】:

据我了解,您的问题是关于从 XML 引用?对吧?

因此,Castle.Windsor 建议“考虑指定类型的程序集限定名称。”。这是什么意思?这意味着,而不是:

<component
    service="Company.IOtherClass"
    type="Company.OtherClass"
/>

你应该给类名加上它们来自的程序集:

<component
    service="Company.IOtherClass, OtherClassAssembly"
    type="Company.OtherClass, OtherClassAssembly"
/>

甚至是完全限定的程序集名称:

<component
    service="Company.IOtherClass, OtherClassAssembly, Version=..., Culture=..., PublicKeyToken=..."
    type="Company.OtherClass, OtherClassAssembly, Version=..., Culture=..., PublicKeyToken=..."
/>

注意:将 OtherClassAssembly 替换为实际的程序集名称,并且不要在此处添加 .dll 扩展名 注意:请参阅http://msdn.microsoft.com/en-us/library/system.type.assemblyqualifiedname.aspx 了解更多详细信息,例如如何处理嵌套类

要在代码中使用OtherClass,你可以使用全局

global::Company.OtherClass

你也可以使用:

using Company;

或者只导入一个类:

using ClassFromOtherCompany = Company.OtherClass;

【讨论】:

  • 谢谢,成功了。我最终只是简单地添加了另一个using assembly 节点:&lt;using assembly="Company" /&gt;。我不知道我可以用它来导入已经编译的 dll。
【解决方案2】:

您可以使用命名空间别名,例如这个 MSDN 示例:

using Co = Company.Proj.Nested;

【讨论】:

  • 但是由于他提到他需要用XML来做,所以别名似乎不是有效的选项
【解决方案3】:

好吧,从问题的描述和您收到的错误消息来看,您的怀疑似乎是正确的。

在 Windsor 运行其安装程序时,Nuget 包中的程序集尚未加载到 AppDomain,因此它无法知道从何处获取 Company.OtherClass

然后,您可以按照错误消息的提示进行操作,并使用程序集限定类型名称,或者使用 &lt;using /&gt; 标记预加载程序集。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-21
    相关资源
    最近更新 更多