【问题标题】:Where does business logic sit in MVVM?业务逻辑在 MVVM 中位于何处?
【发布时间】:2012-06-13 09:47:03
【问题描述】:

我习惯于使用 N-Tier 架构进行开发,即数据访问层、业务逻辑层等

任何人都可以就我的业务逻辑的最佳位置提供任何建议或链接吗?

我是否将所有这些放入我的 Silverlight 应用程序的 Models 文件夹中的类中?

保罗

【问题讨论】:

  • 嗨,保罗。将 MVVM 视为 UI 设计和与特定平台(在您的情况下为 Silverlight)交互的模式。具有业务域的 N 层架构与您熟悉的方式保持一致

标签: silverlight mvvm silverlight-5.0


【解决方案1】:

我遇到了同样的问题并决定这样做: 我在 MVC 中创建了控制器等类(使用我的模型执行一些操作),并在所有 ViewModel 中使用它们。

例如:我们的应用程序有一个书籍列表。我们需要添加/编辑/删除它们。

所以我们有一个模型:

public class Book 
{
    public int BookId { get; set; }
    public string Title { get; set; }
    public string Author { get; set; }
}

然后我们有一个控制器类:

public class BookController 
{
    string dbPath = ...;

    public void AddBook(string title, string author)
    {
        var book = new Book() { Title = title, Author = author };
        AddBook(book);
    }

    public void DeleteBook(int id)
    {
        using (var db = new SQLiteConnection(dbPath))
        {
            db.Delete<Book>(id);
        }
    }

    public void DeleteBook(Book book)
    {
        using (var db = new SQLiteConnection(dbPath))
        {
            DeleteBook(book.BookId);
        }
    }

    public List<Book> GetAllBooks()
    {
        using (var db = new SQLiteConnection(dbPath))
        {
            return db.Table<Book>().ToList();
        }
    }

    public Book FindBook(string title, string author, int id)
    {
        .....
    }
}

现在我们可以在任何需要的地方使用它,例如:

public class BookListViewModel : ViewModelBase 
{
    public BookListViewModel() 
    {
        GetData();    
    }

    private void GetData()
    {
        BookController bc = new BookController(); // here we start using our controller. 
        _books = new List<Book>();
        _books = bc.GetAllBooks();
     }
}

这种方法可以帮助我们:

  1. 单独保留所有业务逻辑(在控制器类中)
  2. 避免代码重复

【讨论】:

    【解决方案2】:

    这是一个很好的问题,答案部分取决于项目的复杂性和开发人员的品味。

    我见过的一些 MVVM 项目把所有东西都放在了 VM 部分,所以 View 的 .cs 文件是空的(因为每个人都知道'代码隐藏'是邪恶的)和模型文件包含被动的“存储类”(即基本上具有封装的 C 结构)。

    对于一些简单的项目(例如几乎没有任何逻辑的查看器)来说,它可能是一个不错的选择。但它会导致类似 blob 的视图模型试图做所有事情,如果您的项目有任何复杂性,这是无法管理的。


    Reed Copsey 的回答(业务逻辑/数据访问应该与 View/ViewModel 解耦)对于具有任何显着复杂性的项目来说是最佳解决方案。

    【讨论】:

    • 这将是一个复杂的系统,我需要在系统的各个区域之间共享逻辑。我也讨厌重复代码,所以我想我会尽我所能保持视图模型的简单,只是出于兴趣,你认为人们传统上会在视图模型中膨胀但实际上应该在模型本身中的示例是什么?
    • 所有类型的逻辑都可以在虚拟机中找到,转换、验证、持久性、业务规则等等。还有很多 View 的东西,比如显示/隐藏部件等......
    【解决方案3】:

    业务逻辑以及数据通常是 MVVM 中模型层的一部分。 View 是视觉效果,而 ViewModel 是让您使用业务特定逻辑和数据的“粘合剂”。

    任何特定于域或业务的东西都应该可以被其他应用程序重用,使用其他架构。

    【讨论】:

    • 好的,谢谢我有很多为普通 C# 站点构建的 C# 代码,如果我想使用它,我想我只会添加对它的引用,或者在 .NET 中是不可能的不是 Silverlight?
    • @Paul 您需要为 silverlight 重建它,或者使用 PCL 编译它,以便它可以同时使用两者。见:msdn.microsoft.com/en-us/library/gg597391.aspx
    猜你喜欢
    • 2013-02-12
    • 2017-04-29
    • 1970-01-01
    • 1970-01-01
    • 2011-07-01
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    • 2021-01-11
    相关资源
    最近更新 更多