如何加载数据从数据库/XML模型在MVVM



嗨,我想知道如何正确地从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周围创建包装器。差不多吧

最新更新