c# - 如何将依赖项注入(inject) asp.net core 中的模型?

标签 c# asp.net asp.net-core asp.net-core-mvc

假设我有一个如下所示的 Controller 操作:

[HttpPost]
public async Task<IActionResult> Add([FromBody] MyModel model){
    await model.Save();
    return CreatedAtRoute("GetModel", new {id = model.Id}, model);
}

为了使 model.Save 正常工作,它需要一些依赖项:

public class MyModel{
    private readonly ApplicationDbContext _context;
    public MyModel(ApplicationDbContext context){
        _context = context;
    }
    public async Task Save(){
        // Do something with _context;
    }
}

截至目前,context 在 MyModel 的构造函数中为 null。我怎样才能注入(inject)它?我知道我可以将服务注入(inject) Controller 并以这种方式在我的模型上执行操作,但是如果我宁愿使用面向对象的方法而不是贫血域模型怎么办?这根本不可能吗?

最佳答案

您应该考虑使用 DTO(数据传输对象)模式重构代码。如果只是

  • MyModel 应该只由一个数据容器 -> 包含属性/计算属性。
  • Save() 方法中的逻辑应该被提取到单独的类中,例如 ModelRepository,它应该知道依赖关系,例如 ApplicationDbContext:

     public class ModelRepository
     {
        private readonly ApplicationDbContext _context;
    
        public ModelRepository(ApplicationDbContext context)
        {
            _context = context;
        }
    
        public async Task Save(MyModel model)
        {
            // Do something with _context;
        }
    }
    
  • 最后,您的 Controller 应该使用 ModelRepository 实例(使用内置 DI 解析它)来保存您的数据:

    [HttpPost]
    public async Task<IActionResult> Add([FromBody] MyModel model)
    {
        await _modelRepository.Save(model);
        return CreatedAtRoute("GetModel", new {id = model.Id}, model);
    }
    

关于c# - 如何将依赖项注入(inject) asp.net core 中的模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39276939/

相关文章:

c# - 如何在 .NET Core DI 中强制创建类的实例?

c# - C# 程序如何使用任何版本的 COM dll?

asp.net - App_Data - Web 应用程序的数据目录。它有多安全?

c# - 如何通过域对象和服务中的验证与 UI 层中的验证保持 DRY

c# - 使用 startup.cs 中分配的委托(delegate)处理 OnTokenValidated 时出现问题

c# - 如何刷新net core中的JWT?

c# - 如何比较两个具有字符串值的对象?

c# - 使用操作上下文跟踪相关事件的问题

javascript - 如何删除警告 "This will upload all files from [Folder]. Only do this if you trust this site."

c# - 使用 ClientScriptManager 将 JavaScript 添加到页面