【问题标题】:Better design pattern for country specific implementation针对特定国家/地区实施的更好设计模式
【发布时间】:2018-05-24 04:38:41
【问题描述】:

在我们的应用程序中,我们有一个针对 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)
    }
}

现在我想实现,当为国家 X 调用 GradeController 时,应该注入 ListModelFor X 并且对于国家 Y 相同。我有一个上下文,我可以从中找到它是哪个国家,但是,我不想在注入模型时,到处保留 if-else 逻辑。

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

【问题讨论】:

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


    【解决方案1】:

    你可以按照工厂方法,

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

    【讨论】:

    • 感谢您的回答,当我们发布模型时有一个问题 [HttpPost] 那么我们该如何实现呢?
    • @KunalKhivensara 对于这种情况,您需要创建自定义模型绑定器,从请求中识别国家并获取GradeListModel 的实例并将属性绑定到实例
    • 我今天会尝试实现这个,让你知道结果!谢谢你:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-08
    • 1970-01-01
    • 1970-01-01
    • 2021-10-09
    • 2017-05-09
    • 1970-01-01
    相关资源
    最近更新 更多