C# 通过层传递类型

C# 通过层传递类型,c#,.net,wcf,oop,types,C#,.net,Wcf,Oop,Types,我在一个解决方案中有三层:数据访问(DA)、业务逻辑(BL)和WCF契约逻辑(CL)——当然是按这个顺序堆叠的 在DA中,存储了一个实体框架模型,其中包含一个类型为的SQL表。我想在CL的层堆栈上访问这种类型,但我不想犯错误,让CL直接与DA对话,而是让CL与BL对话,BL与DA对话——如果这有意义的话 最简单的方法是合并BL和CL层,但是假设我想在我的解决方案中保持指定的分离,我怎么能实现我之前所说的呢 我考虑过以下解决方案: 将类型从DA继承到BL以创建新类型 在CL中创建一个新接口,作为B

我在一个解决方案中有三层:数据访问(DA)、业务逻辑(BL)和WCF契约逻辑(CL)——当然是按这个顺序堆叠的

在DA中,存储了一个实体框架模型,其中包含一个类型为的SQL表。我想在CL的层堆栈上访问这种类型,但我不想犯错误,让CL直接与DA对话,而是让CL与BL对话,BL与DA对话——如果这有意义的话

最简单的方法是合并BL和CL层,但是假设我想在我的解决方案中保持指定的分离,我怎么能实现我之前所说的呢

我考虑过以下解决方案:

  • 将类型从DA继承到BL以创建新类型
  • 在CL中创建一个新接口,作为BL中新类型的手动模板
  • 使用接口在CL中创建新类型
  • 上述解决方案的问题是,如果DL中的类型发生更新,CL中的接口将不再为true,并且可能会中断应用程序。我想一个解决方案,自动更新所有层没有手动干预


    有什么好建议吗?

    一个解决方案可以是有第四层:模型层。此模型包含您希望用作POCO类的所有类。因为它们是POCO类,所以不依赖于EF。如果需要,可以使用
    DataMember
    DataContract
    装饰它们。这不是最好的解决方案,但如果您将
    DataContract
    视为
    Serializable
    的替代方案,我认为这不会破坏抽象或泄露抽象(当然,您可以将其提升到下一个级别并编写序列化代理,但这是相当多的工作)。请注意,模型不以任何方式依赖于WCF,因为这些类型位于System.Runtime.Serialization程序集中,而不是ServiceModel程序集中(当然,也不依赖于EF)

    参考DAL中的模型。在DAL中,您可以创建EF
    DbContext
    (禁用延迟加载和代理生成),使用fluent API添加
    EntityTypeConfiguration
    ,等等

    然后继续从BLL和合同层引用它们

    这样,您就有了一个带有POCO类的单一、统一的模型层,除了有问题的序列化属性外,它与技术无关。

    您需要实现第四层,该层将在所有其他层(例如:公共层)中引用。您将在其中定义将在整个应用程序中使用的类型


    这是一篇很好的文章,解释了您可以使用的不同方法。

    不要实现您详述的3个选项中的任何一个。 正如上面提到的,一个包含DTO或POCO的通用组件,可能还有所有层都将使用的接口契约

    我建议在层与层之间的接口中使用DTO或POCO,并将数据传送到各个层。 有好例子的好医生

    您的实体应该是域模型的一部分,例如业务层。任何其他层都可以引用业务层,而不是反过来。因此,让数据层引用业务层-将EF实体放在业务层中。除了下面的答案,我建议您使用automapper将EF实体转换为业务逻辑中的DTO(数据传输对象)。WCF服务的消费者不得知道您的EF实体。