3

我目前被困在这个解决方案的设计中。

数据层设计包括以下内容:

  • 配方(父高级对象)
    • 语言详细信息(名称,按语言描述)(很多)
      • 标头(很多)
      • 步骤(很多)
        • 成分(很多)
        • 数量(许多)
        • 手续(多)
      • 笔记(很多)

我面临的挑战是如何创建一个数据访问设计,当从 WCF SaveRecipe(recipe) 方法填充对象时,该设计将添加/删除数据库中的子对象?

这都是因为管理层要求我们在应用中增加一个通信层,现在我们的UI耦合到我们的业务层,而BL直接耦合到DAL,我们基本上需要在BL和DAL之间注入WCF .

我在这个线程中读到,使用 L2S 不是 WCF 的好主意,但由于设计不是新的,我们必须使用这种类型的方法,然后一旦我们可以重构大量用户界面工作。

4

4 回答 4

5

如果您尝试使用 WCF 发送内容,我建议您创建一个要在域中移动的数据模型。据我发现,您无法序列化 IQueryable 对象,但您可以创建一组 Linq 填充的类,然后对其进行序列化。例如:

[DataContract]
public class Recipe {

    [DataMember]
    public string Name { get; set; }

    [DataMember]
    public string Description { get; set; }

    [DataMember]
    public List<Ingredient> Ingredients { get; set; }

}

然后用

List<Recipe> recipes = (from r in dc.recipe
                           select new Recpie {
                               Name = r.name,
                               Description = r.description,
                               Ingredients = (Linq code to make list of ingredients)
                           }).ToList();

然后使用 WCF 发送列表就变得轻而易举了。

于 2008-12-31T16:34:07.623 回答
1

我喜欢 Karl 在您引用的线程上的回答:

最好创建自己的类来传输数据对象。当然,这些类将作为 DataContracts 实现。在您的服务层中,您将在 linq-to-sql 对象和数据载体对象的实例之间进行转换。这很乏味,但它将服务的客户端与数据库模式分离。它还具有让您更好地控制系统中传递的数据的优势。

看起来你无论如何都必须重构——就像在你的 UI 层中重构对 linq2sql 的依赖一样开始。

我认为您没有快速简便的解决方案。

于 2008-12-31T16:32:28.640 回答
1

我不建议通过 WCF 公开 L2S 类。创建 DataContract 对象的层次结构,并通过 WCF 传递这些对象。这样做的缺点是您必须将 L2S 对象“深度复制”到 DataContract 层次结构中,但好处是您只能包含通过网络传输所需且适当的字段。例如,在我现在正在处理的一个项目中,我通过网络传递了一个 EmployeeData 对象,该对象包括我的大部分 L2S 员工字段,但不包括员工的加盐哈希和密码盐之类的内容。

于 2008-12-31T16:35:09.120 回答
0

创建包含和排除子条目的类也可能是一个想法。我有时会创建这样的类:

class Recipe {
    [DataMember] public string Name;
    [DataMember] public string Description;
}

class RecipeWithIngredients : Recipe {
    [DataMember] public IList<Ingredient> Ingredients;
}

编辑:在帖子完成之前无意中发布。

于 2008-12-31T16:45:23.873 回答