在我们的应用程序中,我们有一个X国家的公共代码库,现在我们正在使用多态性添加对Y国家的支持。
我们来看这个例子:
public abstract class GradeListModelBase
{
public abstract void CalculateGrade();
public virtual IEnumerable<dynamic> GetGrade()
{
//logic to get grade common for X and Y country.
}
}
public class GradeListModelForX : GradeListModelBase
{
public override void CalculateGrade()
{
//logic to get grade for X
}
}
public class GradeListModelForY : GradeListModelBase
{
public override void CalculateGrade()
{
//logic to get grade for Y
}
}
public class GradeController : Controller
{
public ActionResult List(GradeListModelBase model)
{
model.CalculateGrade();
model.GetGrade();
return View("List", model)
}
}
现在我希望实现这一点,当为Country X调用GradeController时,ListModelFor X应该被注入并且对于国家Y是相同的。我有一个上下文,我可以在哪里找到它所在的国家,但是,我不想在注入模型的同时保持if-else逻辑。
有没有更好的方法来解决这个问题?设计模式?任何可能有帮助的建议。
答案 0 :(得分:2)
您可以遵循工厂方法,
为GradeListModel
public interface IGradeListModelFactory{
GradeListModelBase GetGradeListModel(string country);
}
public class GradeListModelFactory : IGradeListModelFactory
{
public GradeListModelBase GetGradeListModel(string country){
GradeListModelBase gradeListModelBase = null;
switch(country){
case "x":
gradeListModelBase = new GradeListModelForX();
break;
case "y":
gradeListModelBase = new GradeListModelForY();
break;
}
return gradeListModelBase;
}
}
您可以从服务定位器获取实例而不是初始化它,在这种情况下,您需要在工厂中注入服务定位器实例
现在在IOC容器中注册IGradeListModelFactory
,并将其注入控制器,
public class GradeController : Controller
{
private readonly IGradeListModelFactory _gradeListModelFactory;
public GradeController(IGradeListModelFactory gradeListModelFactory){
_gradeListModelFactory = gradeListModelFactory;
}
public ActionResult List()
{
string country = // identify country
GradeListModelBase model = _gradeListModelFactory.GetGradeListModel(country);
model.CalculateGrade();
model.GetGrade();
return View("List", model)
}
}