gpt4 book ai didi

c# - 如何在 BaseController 中初始化 BaseModel

转载 作者:行者123 更新时间:2023-11-30 14:51:59 30 4
gpt4 key购买 nike

我有一类属性,这些属性是从我需要在我的 MVC 应用程序的每个 View 上都可用的服务中设置的。

因此,我创建了一个“基础 View 模型”,我的 View 模型将从中继承。

public class BaseModel
{
public BaseModel()
{
foo = "foo value";
bar = "bar value";
}

public string foo { get; set; }

public string bar { get; set; }
}

public class HomeIndexViewModel : BaseModel
{
}

然后我创建了一个“基础 Controller ”,我的所有 Controller 都将继承自它:

public class BaseController : Controller
{
public BaseController()
{
}
}

public class HomeController : BaseController
{
public ActionResult Index()
{
HomeIndexViewModel model = new HomeIndexViewModel();
return View(model);
}
}

这按预期工作,我可以在我的 View 中调用 @Model.foo 并获取 foo 值

但是我认为我不应该在它的构造函数中初始化 BaseModel 的值,因为这没有使用依赖注入(inject)并且将变得难以进行单元测试。

如何将值 foobar 的设置移动到 BaseController 中?

当然,我可以在 HomeController 中设置值,但我宁愿从 Controller 中抽象它,因为逻辑总是相同的,并且会使我的所有 Controller 膨胀。

最佳答案

我认为问题在于您正在操作 中创建模型的实例,因此基本 Controller 没有引用对象来设置属性。

就我个人而言,我可能会在负责根据需要创建模型的基本 Controller 中选择一些“工厂类型”功能。

例如:

public class BaseController : Controller
{
public T CreateBaseModel<T>() where T : BaseModel, new()
{
return new T
{
foo = "foo value",
bar = "bar value"
};
}
}

然后当您在操作中创建模型时,您可以这样做:

HomeIndexViewModel model = CreateBaseModel<HomeIndexViewModel>();

如果出于某种原因您需要将参数传递给您的模型构造函数,那么您可以像这样重载:

public T CreateBaseModel<T>(params object[] args) where T : BaseModel
{
T model = (T)Activator.CreateInstance(typeof(T), args);
model.foo = "foo";
return model;
}

HomeIndexViewModel model = CreateBaseModel<HomeIndexViewModel>(param1, param2, etc);

备选

上述方法的主要好处是您可以访问操作代码中的 foobar 属性。但是,如果您不关心这一点并且只需要从 View 页面中访问这些值,那么您可以覆盖 OnActionExecuted 方法并在其中应用这些值。这种方法的好处是您无需更改在操作中创建模型的方式...

protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
BaseModel model = filterContext.Controller.ViewData.Model as BaseModel;
if (model != null)
{
model.foo = "foo value";
model.bar = "bar value";
}

base.OnActionExecuted(filterContext);
}

在那里检查 null 意味着它只会尝试应用从 BaseModel 继承的模型的值,这意味着您仍然可以放心地使用其他模型。

通过这种方法,您的操作代码可以恢复到原来的样子:

HomeIndexViewModel model = new HomeIndexViewModel();
return View(model);

关于c# - 如何在 BaseController 中初始化 BaseModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33032457/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com