如何在WPF MVVM应用程序中组织接口和实现

7

我正在开发一个WPF MVVM项目,包含以下项目:

  • Domain(领域层)
  • ViewModels(视图模型层)
  • Infrastructure(基础设施层)
  • Views(视图层)

例如,我需要 IFileService 接口来提供一些文件操作,不包含任何业务逻辑。我确定这个接口的实现将在 Infrastructure 项目中,但我有一个问题:应该把 IFileService 接口放在哪里?

我需要在 ViewModels 项目中使用这个接口,如果我把它放在这个项目中,那么 Infrastructure 就会引用 ViewModels,这是不好的。如果我把它放在 Domain 中,那么同样会有业务相关类的问题。

请帮帮我,如何更好地组织结构和项目之间的引用关系,以及把像 IFileService 这样的接口放在哪里?


1
你可以在基础设施项目中实现接口,当你引用基础设施类实例时,接口也将在视图模型中可用。 - A.T.
@Arun,我认为你的评论应该是对我的问题的回答。我觉得这个答案不错。 - Sergey K
3个回答

4

嗯,为什么不创建一个额外的项目,比如DALDataLayer?它提供了模型类,这也是您清单中缺少的。您还可以将接口IFileService放在那里,尽管我更喜欢使用DataProvidersRepositories(这是我首选的选项),以便VM不知道数据来自哪里。

在我看来,项目Infrastructure不应包含任何复杂的逻辑。我会在那里放一些有用的方法和类,并尽可能保持简单和干净,以便可以在任何地方引用它。也许您甚至不需要它。


在基础设施项目中,所有存储库实现都在IRepository接口中,领域模型类也在该接口中。你所说的DataProvider是什么意思? - Sergey K
1
啊好的。那么DataProvider将是数据的来源。通常使用接口机制。虚拟机将使用IDataProvider,工厂将实例化其后面的实现。-- 我认为,“基础设施”是一个包含存储库实现的项目的名称相当糟糕。至少对我来说,它意味着完全不同的内容(一些公共方法和类,可在解决方案的任何地方使用)。如果IRepositoryDomain中定义,我会将该项目命名为DomainImplementation等。但这是我的意见。 :o) - DHN

3
我在我的MVVM项目中使用的独特规则是,所有项目都引用我的基础架构项目,而我的基础架构项目不引用我的其他项目。
因此,在我看来,IFileService和一般接口应该在基础架构项目中。然后就由你决定在哪里放置实现。基础架构项目通常只有非常基本的逻辑实现,最终实现则会放在一个专门的项目中。
我有时唯一违反这个规则的例外情况是,当我基于现有的MVVM框架开发时,基础架构可能也会引用它,但我尽量避免这种方法。

接口的实现应该放在哪里? - Sergey K
1
这真的取决于您的项目的规模和性质。它是小型的吗?它是否大量使用IoC或反射?这里没有“一刀切”的答案。我会说,您对模块化的需求越多,就越需要专门的库来实现。在数据访问实现方面,拥有DataAccess或DataProvider库可能是一个不错的选择。 - Ucodia

1
你应该将 IFileService 接口放到 Infrastructure 项目中。因为这将使其在每个项目中都可用,因为这是核心项目。而且你可能有不同的实现,例如同步文件读取器和异步文件读取器。所以实现可以放在你的模块或视图模型中。

我的基础设施项目包含了与数据库交互的仓储实现,如果我将 IFileService 放入该项目中,我认为在域层对基础设施项目进行引用不是一个好的做法。 - Sergey K
1
是的,你说得对。你可以从基础架构切换到领域。 - JSJ
你认为在ViewModels中放置与文件一起工作的FileService的实现是好的吗? - Sergey K
1
如果您确定不会有多个IFileService的实现,那么可以将其放在一个全局位置中,无论是ViewModels还是Infrastructure。 - JSJ
谢谢回答,好的,我会把接口放在基础设施中。那么实现应该放在哪里呢? - Sergey K

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接