嗨,我想知道如何正确地从MVVM中的DB初始化模型。
我用Caliburn。微框架,对于依赖注入,我可以使用MEF或Castle Windsor,作为ORM,我可以使用Entity Framework或NHibernate。
我有一个模型类它可以是POCO
public class SomeModel{}
我还有一些视图模型类
public interface IViewModelA
{
ModelA SomeModel{get;set;}
}
public class ViewModelA : ScreenViewModel, IViewModelA
{
public ModelA SomeModel{get;set;}
}
我在视图上绑定了SomeModel的属性。我觉得这风景不好。
我想知道如何正确地从存储库(XML, DB-with ORM)加载数据到模型。
创建另一个类,例如ModelManager init视图模型属性?
此示例使用Caliburn + MEF
public interface IManager{}
[Export(typeof(IManager)]
public class Manager :Screen,IManager
{
//import dependencies with MEF
[Import]
public IViewModelA VMA{get;set;}
public void Init()
{
VMA.SomeModelA=//load from DB
}
}
或者什么是正确和常见的方法?
我想看到一些简单的样本从现实世界与Caliburn。Micro + ORM (NHibernate/Entity Framework)+ IoC (MEF/Castle Windsor).
谢谢
好吧。您需要查找有关DDD和Repository Pattern的信息。简而言之,存储库是访问某种类型数据的一种方式。例如:
public interface ICustomerRepository
{
IEnumerable<Customer> GetCustomers();
Customer GetCustomerById(Guid aId);
}
public class Customer
{
public Guid Id { get; set; }
public string Name { get; set; }
}
public class DbCustomerRepository : ICustomerRepository
{
private DbConnection Connection { get; set; }
public DbCustomerRepository(DbConnection aConnection)
{
Connection = aConnection;
}
public IEnumerable<Customer> GetCustomers()
{
// Do your query to DB here.
yield break;
}
public Customer GetCustomerById(Guid aId)
{
// Do your query to DB here.
return null;
}
}
public class XmlCustomerRepository : ICustomerRepository
{
private string FilePath { get; set; }
public XmlCustomerRepository(string aFilePath)
{
FilePath = aFilePath;
}
public IEnumerable<Customer> GetCustomers()
{
// Find all customers in a XML-file.
yield break;
}
public Customer GetCustomerById(Guid aId)
{
// Find a specific customer in a XML-file.
return null;
}
}
您需要在ViewModel构造函数中传递一个iccustomerrepository。公共类CustomerListViewModel{私有iccustomerrepository存储库{获取;设置;}
public CustomerListViewModel(ICustomerRepository aRepository)
{
Repository = aRepository;
}
public ObservableCollection<Customer> Customers
{
get
{
if (mCustomers == null)
{
IEnumerable<Customer> lCustomers = Repository.GetCustomers();
mCustomers = new ObservableCollection<Customer>(lCustomers);
}
return mCustomers;
}
}
private ObservableCollection<Customer> mCustomers;
}
你应该用iccustomerrepository服务到一个具体组件(例如DbCustomerRepository)的映射来配置你的c -container,并将你的CustomerListViewModel注册为self。但这只是故事的开始。您需要将更改的数据存储在数据源(DB、XML等)中。当然,您可以在存储库中添加方法来保存数据,但这违背了soa原则。最好使用DDD中的工作单元模式。在某些情况下,您需要自定义Customer来为显示方式添加一些额外的属性和方法。填充free以在Customer - CustomerViewModel周围创建包装器。差不多吧