Castle Windsor命名空间冲突

时间:2013-05-15 10:28:18

标签: c# .net namespaces castle-windsor

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

因此,当我在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内部进行了查找。

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

3 个答案:

答案 0 :(得分: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 :(得分:0)

您可以使用名称空间别名,例如此MSDN示例:

using Co = Company.Proj.Nested;

答案 2 :(得分:0)

嗯,从问题的描述和你得到的错误信息来判断你的怀疑是正确的。

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

然后,您可以按照错误消息的建议执行操作,并使用程序集限定类型名称,或使用<using />标记预加载程序集。