我有一堆模型更新例程,只会随传递的模型而变化,例如:
public void UpdateAccount(AccountViewModel model)
{
var _currentData = (from data in db.Accounts
where data.AccountId == model.AccountId
select data).Single();
Mapper.Map(model, _currentData);
Save();
}
我有许多类似的函数,其中传递的模型随数据键而变化。这可以更通用吗?
答案 0 :(得分:2)
一种选择是让每个模型实现相同的界面:
interface IViewModel
{
int AccountId { get; }
}
class AccountViewModel : IViewModel
{
...
}
然后,您可以将实现此接口的任何视图模型传递给UpdateAccount
方法:
public void UpdateAccount(IViewModel model)
{
var _currentData = (from data in db.Accounts
where data.AccountId == model.AccountId
select data).Single();
Mapper.Map(model, _currentData);
Save();
}
或者您可以将其定义为:
public void UpdateAccount<TViewModel>(TViewModel model)
where TViewModel: IViewModel { ... }
但是,这意味着您还必须更改Mapper.Map(...)
方法的定义以接受新界面:Mapper.Map(IViewModel model, ...)
。
编辑:刚看到每个viewmodel都有一个不同的数据密钥(属性?),也许这是一个更好的解决方案:
public void UpdateAccount<T>(T model, Func<T, int> dataKeySelector)
{
var _currentData = (from data in db.Accounts
where data.AccountID == dataKeySelector(model)
select data).Single();
Mapper.Map(model, _currentData);
Save();
}
UpdateAccount(model, m => m.AccountID);
可以调用哪个。
希望这有帮助。