Как загрузить данные из DB / XML в модель в MVVM - PullRequest
0 голосов
/ 02 ноября 2011

Привет, я хотел бы знать, как правильно инициализировать модель из БД в MVVM.

Я использую 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) в модель.

Создать здесь какой-нибудь другой класс, например, свойства моделей представления инициализации ModelManager?

Этот образец с 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 голосов
/ 06 июня 2012

Хорошо. Вам нужно найти информацию о DDD и шаблоне репозитория. Короче говоря, репозиторий - это способ доступа к данным какого-либо типа. Например, вы можете иметь:

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 { частный репозиторий ICustomerRepository {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;
}

Вы должны настроить свой IoC-контейнер с отображением службы ICustomerRepository на конкретный Компонент (например, DbCustomerRepository), а также зарегистрируйте свой CustomerListViewModel как self. Но это только начало истории. Вам необходимо сохранить измененные данные в источнике данных (БД, XML и т. Д.). Конечно, вы можете добавить метод в репозиторий для сохранения данных, но он не подходит для S.O.L.I.D. принципы. Лучше использовать шаблон «Единица работы» от DDD В какой-то момент вам нужно будет настроить Customer, чтобы добавить некоторые дополнительные свойства и методы для средств отображения. Не стесняйтесь, чтобы создать обертку вокруг Customer - CustomerViewModel. Нечто подобное.

...