此问题类似于Where does business logic sit in MVVM?
然而,我不想在这上面创建一个评论链
例如,假设我有一个发票表,我想要获取这些数据并对其执行一些分配,以便在2个完全独立的报告和3个屏幕中使用。
在我们当前的web应用程序中,我会将它放在数据服务层中,并且我所有的报告和屏幕都会调用它
在MVVM中,人们似乎建议模型不应该臃肿,而应该将逻辑放在视图模型中。但是在这种情况下,我会重复5次代码吗?
在他对我的另一个问题的回答中,Reed说:“任何特定于域或业务的东西都应该可以被其他应用程序重用,使用其他架构。”
Reed或其他人能澄清我的方法应该是什么吗?MVVM可以与其他架构结合使用吗?
我正在使用Silverlight 5和Simple MVVM Toolkit
保罗
发布于 2012-06-20 13:13:06
ViewModel不是用于业务逻辑的。它用于用户界面逻辑。正如给定的名称一样,它表示视图。如果您有五个不同的报告呈现相似的数据,请为这些数据指定一个名称,并使所有五个ViewModels都了解如何使用数据对象。
由于我们讨论的是报告,因此数据被理解为仅显示。ViewModel可以只是一个简单的数据源,具有最少的用户界面交互,基本上是一个非常薄的层。
发布于 2013-04-02 22:35:44
我遇到了同样的问题,并决定走这条路:
我在MVC中创建了像控制器这样的类(使用我的模型执行一些操作),并在所有ViewModels中使用它们。
例如:我们的应用程序有一个图书列表。我们需要添加/编辑/删除它们。
所以我们有一个模型:
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)避免代码重复
https://stackoverflow.com/questions/11070404
复制相似问题