«Универсальный» ViewModel - PullRequest
0 голосов
/ 18 января 2010

Используя EF 4, у меня есть несколько подтипов бизнес-объекта (клиенты, поставщики, транспортные компании и т. Д.). Они должны быть подтипами. Я создаю общую модель представления, которая вызывает службу, из которой осуществляется доступ к универсальному репозиторию.

Поскольку у меня есть 4 подтипа, было бы хорошо иметь «общую» модель представления, используемую для всех этих. Проблема, конечно, в том, что я должен вызывать определенный тип в моем общем хранилище, например:

BusinessToRetrieve = _repository
    .LoadEntity<Customer>(o => o.CustomerID == customerID);

Было бы хорошо иметь возможность вызывать <SomethingElse>, что-то еще (это один или другой из подтипов), в противном случае мне придется создать 4 близко идентичных viemodels, что, конечно, кажется пустой тратой! Имя сущности подтипа доступно для модели представления, но я не смог выяснить, как заставить приведенный выше вызов преобразовать это в тип. Проблема с достижением того, чего я хочу, заключается в том, что, по-видимому, передаваемое лямбда-выражение не сможет разрешиться при «общем» вызове?

Ответы [ 2 ]

2 голосов
/ 18 января 2010

Я не уверен, что вы этого хотите, но вас могут заинтересовать MicroModels

public class EditCustomerModel : MicroModel
{
    public EditCustomerModel(Customer customer, 
                             CustomerRepository customerRepository)
    {
        Property(() => customer.FirstName);
        Property(() => customer.LastName).Named("Surname");
        Property("FullName", () => string.Format("{0} {1}", 
                                           customer.FirstName, 
                                           customer.LastName));
        Command("Save", () => customerRepository.Save(customer));
    }
}
2 голосов
/ 18 января 2010

Похоже, вам необходимо ознакомиться с генериками . Для начала вы сможете написать такой код:

class ViewModel<T> where T : Business {
    public void DoSomething(Func<T, bool> predicate) {
        BusinessToRetreive = _repository.LoadEntity<T>(predicate);
    }
}

Тогда вы можете сказать:

ViewModel<Customer> c = new ViewModel<Customer>();
c.DoSomething(o => o.CustomerID == customerID);
...