c#跨不同的程序集

时间:2011-07-20 11:52:35

标签: c# asp.net web-services casting assemblies

我是一个大型项目的一部分。我工作的公司决定将其部分代码转换为Web服务,以实现一些效率和代码整合的原因。我已经转换了一些代码来停止使用对项目内其他程序集的引用。现在,代码现在使用我在向项目添加Web引用时生成的代码。

问题是使用我修改的代码的组件提供了从不同程序集构造的对象,而我从生成的代码中创建/使用/返回对象。现在即使对象是相同的,我也不能将它们互相投射。是否有任何方法强制演员,因为我关注的对象非常笨重,我不想写一个自定义映射器或类似的东西。

问题的一个例子是:项目包含许多小组件A,B,C ...... Z

代码使用了组件A中类的对象caled让我们说苹果例如A,apple()

现在在更改之后,代码使用了名为“Web”的自动生成的webservice类创建的对象,因此Web.apple()

后面的web服务实际上引用了A.apple,所以Web.Apple和A.apple是相同的东西。

那么我如何让c#相信我他们确实是同一件事并停止给我施法错误?

根据公司政策P.S我无法上传任何代码,但我认为这是无关紧要的,因为ablove示例应该解释这种情况。

并提前致谢

非常感谢您的回答,这就是我最终所做的:

我发现Apple有一个合并方法,我将Web.apple和A.apple合并在一起.. 我想在我之前有一个人遇到了解决这个问题的麻烦..

再次感谢

3 个答案:

答案 0 :(得分:3)

当您创建服务引用时,您可以重用对象,以便它们不会再次构建(当然,您将丢失漂亮的自动生成的东西)。

例如:

SERVER:

[DataContract(Namespace = "http://abc.com/"]
public class Apple
{
    [DataMember]
    public bool IsEvil { get; set; }

    [IgnoreDataMember]
    public bool IsPoisoned { get; set; }
}

客户端:

[DataContract(Namespace = "http://abc.com/"]
public class Apple
{
    [DataMember]
    public bool IsEvil { get; set; }

    [IgnoreDataMember]
    public bool ClientSideBool { get; set; }
}

这两个在名称和命名空间中匹配,数据库匹配。如果包含服务引用的app /程序集具有对此对象的引用,则它不会重新编码它。相反,它将重用它。当然,所有内容都必须匹配,包括XML命名空间,名称,数据库要求,顺序,名称等。在添加服务引用之前,必须编译和引用包含Apple的外部程序集(或者你将不得不参考服务参考。)

确保命名空间匹配的一种好方法是使用将您的CLR命名空间映射到XML命名空间的ContractNamespaceAttribute。确保两个对象都映射到同一个XML命名空间。

答案 1 :(得分:2)

我认为AutoMapper正是您所寻找的。

答案 2 :(得分:1)

将Web服务引用导入任何其他应用程序时,.NET代表您创建客户端代理。它们可能出现相同,但它们实际上是完全不同的类型。您可以在这里看到人们创建数据传输对象(DTO)只是为了执行映射。

正如@Daniel Hilgarth建议的那样,您可能希望使用AutoMapper。它使用规则来自动化创建DTO的许多繁琐的本性。