业务逻辑在MVVM中的位置在哪里?

时间:2012-06-09 19:39:13

标签: silverlight mvvm silverlight-5.0

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

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

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

3 个答案:

答案 0 :(得分:14)

业务逻辑以及数据通常是MVVM中Model层的一部分。 View是视觉效果,ViewModel是“胶水”,可让您使用特定于业务的逻辑和数据。

任何特定于域或业务的内容都应该由其他应用程序使用其他体系结构重用。

答案 1 :(得分:2)

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

我见过的一些MVVM项目将所有内容放在VM部分中,因此View的.cs文件为空(因为所有人知道'代码隐藏'是邪恶的< / sarcasm>)和模型文件包含被动“存储类”(即基本上具有封装的C结构)。

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


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

答案 2 :(得分:2)

我遇到了同样的问题并决定采用这种方式: 我在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. 避免代码重复