Silverlight 如何避免MVVM中的代码重复?
这个问题类似于 然而,我不想在上面创建一个评论链 比如说,我有一个发票表,我想得到这些数据并对其进行一些分配,以便在2个完全独立的报告和3个屏幕中使用 在我们当前的web应用程序中,我会将其放在数据服务层,我的所有报告和屏幕都会将其称为 在MVVM中,人们似乎建议模型不应该过于臃肿,而应该将逻辑放在视图模型中。但在这种情况下,我会将代码复制5次吗 里德在回答我的另一个问题时说:“任何特定于域或业务的内容都应该可以被其他应用程序使用其他体系结构重用。” 里德或其他人能澄清我的方法应该是什么吗?MVVM可以与其他体系结构结合吗 我正在使用Silverlight 5和简单的MVVM工具包Silverlight 如何避免MVVM中的代码重复?,silverlight,mvvm,mvvm-toolkit,Silverlight,Mvvm,Mvvm Toolkit,这个问题类似于 然而,我不想在上面创建一个评论链 比如说,我有一个发票表,我想得到这些数据并对其进行一些分配,以便在2个完全独立的报告和3个屏幕中使用 在我们当前的web应用程序中,我会将其放在数据服务层,我的所有报告和屏幕都会将其称为 在MVVM中,人们似乎建议模型不应该过于臃肿,而应该将逻辑放在视图模型中。但在这种情况下,我会将代码复制5次吗 里德在回答我的另一个问题时说:“任何特定于域或业务的内容都应该可以被其他应用程序使用其他体系结构重用。” 里德或其他人能澄清我的方法应该是什么吗?MV
Paul视图模型不适用于业务逻辑。它用于用户界面逻辑。正如其名称所示,它代表的是视图。如果有五个不同的报告显示相似的数据,请为这些数据命名,并使所有五个ViewModel都了解如何使用数据对象
因为我们讨论的是报告,所以数据被理解为只显示。ViewModel可以只是一个简单的数据源,用户界面交互最少,基本上是一个非常薄的层。ViewModel不适用于业务逻辑。它用于用户界面逻辑。正如其名称所示,它代表的是视图。如果有五个不同的报告显示相似的数据,请为这些数据命名,并使所有五个ViewModel都了解如何使用数据对象
因为我们讨论的是报告,所以数据被理解为只显示。ViewModel可以只是一个简单的数据源,用户界面交互最少,基本上是一个非常薄的层。我也遇到了同样的问题,决定这样做: 我在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) 避免代码重复我面临同样的问题,决定这样做: 我在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) 避免代码重复如果不能建立一个“助手”类或一个对象来处理报告的公共输入,并输出一个可以对ViewModels进行编码的公共对象?好的,谢谢,这将放在silverlight应用程序的helpers文件夹中是吗?哦,简单的方法是,您可以使用公共上下文,如make one class和defined all method,根据需要,然后第一次创建该类对象,就像在viewmodellocator中一样,然后可以使用相同的方法整个应用程序的上下文,您无需再次编写所有该方法,只需使用该对象。如果不能建立一个“helper”类或对象来处理报告的公共输入,并输出一个可以对ViewModels进行编码的公共对象?好的,谢谢,这将放在silverlight应用程序的helpers文件夹中是吗?哦,简单的方法是,您可以使用公共上下文,如make one class和defined all method,根据需要,然后第一次创建该类对象,就像在viewmodellocator中一样,然后可以使用相同的方法整个应用程序的上下文,您不需要再次编写所有该方法,只需使用该对象,在我的silerlight应用程序中,视图模型将获取这些数据的位置?我会有一个名为“服务”的文件夹吗?在我的silerlight应用程序中,视图模型将从何处获取这些数据?我需要一个名为“服务”的文件夹吗?