'通用'ViewModel

时间:2010-01-18 17:31:31

标签: entity-framework mvvm repository generics entity-framework-4

使用EF 4,我有几个“商业”实体的子类型(客户,供应商,运输公司等)。他们需要是亚型。我正在构建一个通用的viewmodel,它调用一个从中访问通用存储库的服务。

由于我有4个子类型,所以最好使用一个'通用'视图模型。问题当然是我必须将特定类型调用到我的通用存储库中,例如:

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

最好能够调用<SomethingElse>,其中一个或另一个是子类型,否则我将不得不创建4个几乎相同的模型,这似乎是浪费!视图模型可以使用子类型实体名称,但我无法弄清楚如何将上述调用转换为类型。实现我想要的一个问题是,传入的lambda表达式无法在“泛型”调用中解析?

2 个答案:

答案 0 :(得分:2)

听起来你需要熟悉generics。首先,您将能够编写如下代码:

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);

答案 1 :(得分:2)

我不确定这是否是您想要的,但您可能对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));
    }
}