如何将数据从DB / XML加载到MVVM中的Model

时间:2011-11-02 19:50:42

标签: orm mvvm dependency-injection caliburn.micro

您好我想知道如何在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)从现实世界中看到一些简单的样本。

谢谢

1 个答案:

答案 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的包装器。 这样的事情。