更好的国家特定实施设计模式

时间:2018-05-24 04:38:42

标签: c# asp.net-mvc design-patterns dependency-injection

在我们的应用程序中,我们有一个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逻辑。

有没有更好的方法来解决这个问题?设计模式?任何可能有帮助的建议。

1 个答案:

答案 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)
    }
}