如何避免MVVM中的代码重复?

时间:2012-06-17 09:49:36

标签: silverlight mvvm mvvm-toolkit

此问题与Where does business logic sit in MVVM?

类似

但是,我不想在那个

上创建评论链

让我们举例来说,我有一张发票表,我希望获得这些数据并对其进行一些分配,准备在2个完全独立的报告和3个屏幕中使用。

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

在MVVM中,人们似乎建议模型不应该膨胀,逻辑应该放在视图模型中。但在这种情况下,我要复制代码5次?

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

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

我正在使用Silverlight 5和Simple MVVM Toolkit

2 个答案:

答案 0 :(得分:0)

ViewModel不适用于业务逻辑。它适用于用户界面逻辑。正如它的名字所示,它代表了View。如果您有五个不同的报告显示类似的数据,请为此数据指定名称,并使所有五个ViewModel了解如何使用数据对象。

由于我们正在讨论报告,因此只能显示数据。 ViewModel可以只是一个简单的数据源,用户界面交互最少,基本上是一个非常薄的层。

答案 1 :(得分:0)

我遇到了同样的问题并决定采用这种方式:

我在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)避免代码重复