儘管我在我的原始問題中提到過這是一個可能的解決方案,但它最終解決了我的問題,而且我現在非常喜歡它。這樣我就不需要觸摸模型的默認綁定實現,我認爲這種方法比我最初要求的方法更具可讀性/可理解性。
如果不清楚爲什麼我想採用這種方法,我已經添加了一個例子,說明如何使用它來實現面向對象的好處。
[HttpPost]
public ActionResult SaveModelA(ModelA model)
{
return SaveModel(model);
}
[HttpPost]
public ActionResult SaveModelB(ModelB model)
{
return SaveModel(model);
}
private ActionResult SaveModel(IModel model)
{
IExampleService exampleService;
IRequirements requirements;
switch (model.SubsetType)
{
case SubsetType.ModelA:
myService = new ModelAService();
requirements = new ModelARequirements
{
ModelASpecificProperty = "example"
};
break;
case SubsetType.ModelB:
myService = new ModelBService();
requirements = new ModelBRequirements
{
ModelBSpecificProperty1 = "example",
ModelBSpecificProperty2 = "example2",
ModelBSpecificProperty3 = "example3"
};
break;
default:
throw new InvalidEnumArgumentException();
}
var serviceResonse = exampleService.ExecuteExample(model, requirements);
return RedirectToAction("Index", new
{
ExampleData = serviceResponse.ExampleDate
});
}
如果它不是在代碼中明確:
ModelA : IModel
ModelB : IModel
ModelARequirements : IModelRequirements
ModelBRequirements : IModelRequirements
ModelAService : IExampleService
ModelBService : IExampleService
// and IModel defines a property SubsetType SubsetType { get; }
謝謝你的建議。有趣的是你提到了行動應該如何變薄,因爲這正是我爲什麼要這樣做的原因,因爲目前有很多行動都是在做100行的行爲代碼。我把它放到一個像你所建議的服務中,並且留下了非常簡單的操作,這些操作都以相同的方式運行(只是使用不同的模型)。現在我已經爲每個具體的類做了一個Action,讓他們都像方法一樣運行我的抽象工廠。現在面臨一個新的問題,發佈的對象爲空...... :( – Arkiliknam 2012-01-11 17:11:15