【问题标题】:How to avoid code duplication in MVVM?如何避免 MVVM 中的代码重复?
【发布时间】:2012-06-19 16:31:08
【问题描述】:

这个问题类似于Where does business logic sit in MVVM?

但是,我不想在那个上创建评论链

例如,假设我有一张发票表,我想获取这些数据并对其执行一些分配,以便在 2 个完全独立的报告和 3 个屏幕中使用。

在我们当前的 Web 应用程序中,我会将它放在数据服务层中,我的所有报表和屏幕都会调用它

在 MVVM 中,人们似乎建议不应该让模型臃肿,而应该将逻辑放在视图模型中。但在这种情况下,我将重复代码 5 次?

在他对我的另一个问题的回答中,Reed 指出“任何特定于领域或业务的东西都应该可以被其他应用程序重用,使用其他架构。”

Reed 或其他人能否澄清我的方法应该是什么? MVVM 可以和其他架构结合吗?

我正在使用 Silverlight 5 和 Simple MVVM Toolkit

保罗

【问题讨论】:

  • 难道不能建立一个“帮助”类或一个对象来处理报告的公共输入,并输出一个您可以针对 ViewModel 编写代码的公共对象吗?
  • 好的,谢谢,所以这将位于 silverlight 应用程序的 helpers 文件夹中,是吗?
  • 哦,简单的方法是您可以使用通用上下文,例如创建一个类并定义您想要的所有方法,然后像在 viewmodellocator 中一样第一次创建该类对象,然后您可以为整个应用程序使用相同的上下文并且您不需要再次编写所有方法只需使用该对象

标签: silverlight mvvm mvvm-toolkit


【解决方案1】:

ViewModel 不适用于业务逻辑。它用于用户界面逻辑。正如它的名字一样,它代表视图。如果您有五个呈现相似数据的不同报告,请为这些数据命名,并让所有五个 ViewModel 都了解如何使用数据对象。

由于我们谈论的是报告,因此数据被理解为仅显示。 ViewModel 可以只是一个具有最少用户界面交互的简单数据源,基本上是一个非常薄的层。

【讨论】:

  • 在我的 silerlight 应用程序中,这些数据将位于视图模型的哪个位置?我会有一个名为 services 的文件夹吗?
【解决方案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();

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

这种方法可以帮助我们:

1)将所有业务逻辑分开(在控制器类中)

2) 避免代码重复

【讨论】:

    最近更新 更多