【问题标题】:How to hide lower tiers from the upper ones yet make them able to pass data?如何从上层隐藏下层但让它们能够传递数据?
【发布时间】:2020-01-29 20:46:31
【问题描述】:

我正在用 C# 做一个家庭项目。我的项目包括 EF。它有一个数据库、一个包含所有模型类的 EF 自动生成的实体类库、一个存储库层和一个表示层。我希望表示层独立于数据层。我以为我制作了另一个包含实体接口的层,因此在上层中,我可以仅引用接口层并且仍然能够传递数据,而不会意外修改数据或依赖于数据。但是,这不起作用,因为模型生成器类会引发属性未映射的异常。我现在很困惑。我怎么能做到这一点?我应该考虑任何设计模式吗?

谢谢。

【问题讨论】:

  • 你能告诉我们你得到了什么以及你得到了什么异常吗?
  • 我查看了您为我提供的答案。这就是我正在做的事情,但是我没有创建另一个部分类,而是创建了声明所有模型属性的接口。它构建得很好,但是当我想遍历这样的实体时:` var stuff = entityRepo.GetAll(); Console.WriteLine("实体:"); foreach (var item in stuff) { //something }` 在迭代时抛出错误:System.InvalidOperationException: 'The type 'AppInterfaces.IEntity' was not mapped.
  • 在分层架构中,较高层可能依赖于较低层。而且你总是依赖于你的数据模型。在某些情况下,您可以插入一个中间层以最小化更改的范围,但这实际上既不是这里也不是那里。你的表现层永远不会完全独立于数据层。

标签: c# entity-framework interface layer


【解决方案1】:

实体类作为部分类生成,因此您可以使用其他成员(如方法、字段等)扩展这些类。我要做的是在 Repository 项目中添加另一个实现所需接口的部分类。该接口将在您的接口项目中定义。这样您就可以从存储库而不是特定类返回接口。

在您的存储库中,这是自动生成的数据模型

    public partial class EntityClass
    {
        public int MyProperty { get; set; }

        public string String { get; set; }

        public bool Boolean { get; set; }
    }

然后在同一个项目中定义具有相同名称的部分类。请记住在此处保留与原始自动生成模型完全相同的命名空间!

    public partial class EntityClass : IEntityClass
    {
        public int AnotherOne { get; set; }
    }

在您的界面项目中,您可以添加类似这样的内容

    public interface IEntityClass
    {
        int MyProperty { get; set; }

        string String { get; set; }

        bool Boolean { get; set; }

        int AnotherOne { get; set; }
    }

请记住,这是一种非常繁琐的方法,因为您必须记住在更改数据模型时更新界面。其他常用的方法是定义 DTO(数据传输对象)。

Here有人问过类似的问题。请阅读本文。

【讨论】:

    猜你喜欢
    • 2016-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-30
    • 2019-05-29
    • 2012-04-03
    • 1970-01-01
    • 2023-01-07
    相关资源
    最近更新 更多