当我们拥有固定的数据库设计并且我们需要支持从第三方数据源导入数据时,您将如何在.NET中设计应用程序(类库中的类,接口),这很可能是在XML?
例如,假设我们的数据库中有一个包含列的Products表 ID 标题 描述 TaxLevel 价
另一方面我们有产品: 产品编号 ProdTitle 文本 BasicPrice 量。
目前我这样做: 让第三方XML转换为类和XSD,然后将其内容反序列化为强类型对象(我们得到的结果是像ThirdPartyProduct,ThirdPartyClassification等类。)
然后我有这样的方法:
InsertProduct(ThirdPartyProduct newproduct)
我目前不使用接口,但我想。我想要的是实现像
这样的东西public class Contoso_ProductSynchronization : ProductSynchronization
{
public void InsertProduct(ContosoProduct p)
{
Product product = new Product(); // this is our Entity class
// do the assignments from p to product here
using(SyncEntities db = new SyncEntities())
{
// ....
db.AddToProducts(product);
}
}
// the problem is Product and ContosoProduct have no arhitectural connection right now
// so I cannot do this
public void InsertProduct(ContosoProduct p)
{
Product product = (Product)p;
using(SyncEntities db = new SyncEntities())
{
// ....
db.AddToProducts(product);
}
}
}
其中ProductSynchronization将是一个接口或抽象类。很可能会有许多ProductSynchronization的实现。我不能硬编码类型 - 像ContosoProduct这样的类,NorthwindProduct可能是从第三方XML创建的(所以我最好继续使用反序列化)。
希望有人能理解我在这里要解释的内容。想象一下你是卖家,你有很多供应商,每个供应商都使用他们自己专有的XML格式。我不介意开发,当然每次出现新格式时都需要开发,因为它只需要10-20个方法来实现,我只想让架构开放并支持它。
在您的回复中,请关注设计而不是数据访问技术,因为大多数都非常简单易用(如果您需要知道,EF将用于与我们的数据库进行交互)。
答案 0 :(得分:0)
[编辑:设计说明]
好的,从设计的角度来看,我会对传入的xml执行xslt,将其转换为统一格式。也很容易验证结果xml朝向模式。
使用xslt我会远离任何接口或抽象类,并且在我的代码中只有一个类实现,即内部类。它会保持代码库的清洁,如果数据就像你说的那样简单,那么xslt本身应该很短。
只要您拥有项目文档,就可以轻松地记录转换。
如果你决定你绝对想要每个xml有一个类(或者你可能从一个客户那里获得了.net dll而不是xml),那么我会让代理类继承一个接口或抽象类(基于你的内部类,并在代理类中根据需要实现每个属性的映射。这样您就可以将任何类转换为基类/内部类。
但在我看来,在代码中进行转换/映射会使代码设计变得更加混乱。
[原始答案]
如果我理解正确,您希望将ThirdPartyProduct类映射到您自己的内部类。
最初我在考虑类映射。使用Automapper之类的东西,并在创建xml反序列化代理时配置映射。如果使反序列化最终使用与内部类相同的属性名称,那么对映射器的配置就会减少。约定优于配置。
我想听听有关这条路线的任何想法。
另一种方法是在Converter类中添加.ToInternalProduct( ThirdPartyClass )
。并在添加更多外部类时继续添加更多内容。
第三种方法适用于XSLT人员。如果您喜欢XSLT,您可以将xml转换为可以反序列化到内部产品类中的内容。
我选择这三个中的哪一个取决于程序员的技能,以及谁将继续添加新的外部类。当新格式到达时,XSLT方法不需要重新编译或编译代码。这可能是一个优势。