Castle Windsor 命名空间冲突

4
假设我正在一个名为Org.Company的命名空间中工作,该命名空间包含MyClass。我还导入了一个名为Company,类名为OtherClass的NuGet。
所以,当我在我的Org.Company命名空间中工作时,我不能执行以下操作: Company.OtherClass obj;,因为编译器会认为我实际上是指:Org.Company.Otherclass obj,而这个类并不存在。
据我所知,我必须导入其他命名空间,如using Company;,而不是使用完全限定名称。
然而,问题在于我需要从XML文件(Castle Windsor配置文件)引用这个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程序集中定义的。
我猜如果有一种方法可以添加另一个<using />语句来引用Nuget包,那么这个问题就可以解决。是否有办法做到这一点?

Castle Windsor会返回任何错误消息吗?或者你可以在其中使用包括程序集的完全限定名称吗? - Jarek
3个回答

5

据我所了解,您的问题是有关于从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;

1
谢谢,那个方法可行。我最终只是添加了另一个 using assembly 节点,如下所示:<using assembly="Company" />。我不知道我可以使用它来导入已编译的dll。 - dcastro

0

你可以使用命名空间别名,就像MSDN上的这个示例:

using Co = Company.Proj.Nested;

但是由于他提到需要使用XML,所以别名似乎不是有效的选项。 - Jarek

0

根据问题描述和错误信息,看起来你的怀疑是正确的。

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

您可以按照错误消息建议的方式使用程序集限定类型名称,或使用<using />标记预加载程序集。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接