您好我想知道如何在MVVM中从DB初始化Model。
我使用Caliburn.Micro Framework,对于依赖注入,我可以使用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)到Model的正确加载数据。
在这里创建另一个类,例如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)从现实世界中看到一些简单的样本。
谢谢
答案 0 :(得分:0)
好。您需要查找有关DDD和存储库模式的信息。简而言之,Repository是一种可以访问某种类型数据的方式。例如,您可以:
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构造函数传递给ICustomerRepository。 公共类CustomerListViewModel { private ICustomerRepository Repository {get;组; }
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;
}
您应该使用服务ICustomerRepository到具体Component(例如DbCustomerRepository)的映射来配置IoC容器,并将CustomerListViewModel注册为self。 但这只是故事的开始。您需要将更改的数据存储在数据源(DB,XML等)中。当然,您可以在存储库中添加一个方法来保存数据,但它是针对S.O.L.I.D.原则。最好使用DDD的工作单元模式。在某些时候,您需要自定义Customer以为显示方式添加一些其他属性和方法。免费填写以创建Customer - CustomerViewModel的包装器。 这样的事情。