我目前停留在这个解决方案的设计中。
数据层设计包括以下内容:
我遇到的挑战是如何创建一个数据访问设计,当从WCF SaveRecipe(配方)方法填充对象时,该设计将添加/删除数据库中的子对象?
这一切都源于管理层要求我们在我们的应用程序中添加通信层,现在我们的UI耦合到我们的业务层,而BL直接耦合到DAL,我们基本上需要在之间注入WCF BL和DAL。
我在this thread中读到使用L2S对WCF不是一个好主意,但由于设计不是新的,我们必须使用这种方法,然后一旦我们离开它可以重构大量的UI工作。
答案 0 :(得分: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一起发送成为一块蛋糕。
答案 1 :(得分:1)
我喜欢Karl在您引用的thread上的回答:
最好创建自己的 数据传输的类 宾语。那些课程,当然, 将作为DataContracts实现。 在您的服务层中,您将进行转换 linq-to-sql对象和 数据载体对象的实例。 这很乏味,但它解耦了 服务的客户来自 数据库架构。它也有 给你更好的控制的好处 传递的数据 你的系统。
看起来你无论如何都要进行重构 - 首先重构你的UI层中对linq2sql的依赖。
我认为你没有快速简便的解决方案。
答案 2 :(得分:1)
我不建议在WCF上公开L2S类。创建DataContract对象的层次结构,并通过WCF传递它们。这样做的缺点是您必须将L2S对象“深度复制”到DataContract层次结构中,但好处是您只能包含通过网络传输所必需且适当的字段。例如,在我正在进行的项目中,我通过网络传递一个EmployeeData对象,该对象包含我的大部分L2S员工字段,但不包括雇员的盐渍哈希和&amp;密码盐。
答案 3 :(得分:0)
创建包括和排除子条目的类也是一个想法。我有时会创建这样的类:
class Recipe {
[DataMember] public string Name;
[DataMember] public string Description;
}
class RecipeWithIngredients : Recipe {
[DataMember] public IList<Ingredient> Ingredients;
}
编辑:在帖子结束前无意中发布。