为什么它需要默认构造函数而不是直接使用我的工厂方法?

安德烈·布什曼

使用Visual Studio 2017我有一个ASP.NET Core MVC 应用程序。我注册了我工厂的必要方法,因为在模型中每个我的类的每个实例只能通过工厂创建:

public void ConfigureServices(IServiceCollection services)
{
    services.AddTransient<ITechnicalTask>(_ =>
        // It returns ITechnicalTask instance
        ModelFactory.Current.CreateTechnicalTaskTemplate(
            "Template Name"));

    // Add framework services.
    services.AddMvc();

}

我的控制器有这样的方法:

[HttpGet]
public IActionResult CreateTemplate() => View();

[HttpPost]
public IActionResult CreateTemplate(ITechnicalTask item)
{    
    repo.Templates.Add(item);
    return View("TemplatesList");
}

这是我的表格:

<form asp-action="CreateTemplate" method="post">
    <div class="form-group">
        <label asp-for="TemplateName">Template name:</label>
        <input class="form-control" asp-for="TemplateName" />
    </div>
    <div class="text-center">
        <button class="btn btn-primary" type="submit">
            Accept
        </button>
    </div>
</form>

当我按下Accept按钮时出现异常

处理请求时发生未处理的异常。

InvalidOperationException: 无法创建类型为“PikProject.RobotIRA.ITechnicalTask​​”的实例。模型绑定复杂类型不能是抽象类型或值类型,并且必须具有无参数构造函数。

Microsoft.AspNetCore.Mvc.ModelBinding.Binders.ComplexTypeModelBinder.CreateModel(ModelBindingContext bindingContext)

为什么它需要默认构造函数?为什么用我的工厂方法还不够?

UPD

我的商业模式位于其他项目中。它的所有类都是internal. 只有接口和耦合类是public. 它还定义用于创建接口的必要实例的工厂接口:

public interface IModelFactory {

    IEmployee CreateEmployee(string name,
        string middleName, string surname,
        string post);

    IAddress CreateAddress(string country, string region,
            string town, string street, string hoseNumber = "",
            string notes = "");

    IApproval CreateApproval(IEmployee employee,
        DateTime? datetime = null);

    IApprovalCollection CreateApprovalCollection();

    IRequirementsCollection CreateRequirementsCollection();

    IRequirement CreateRequirement(RequirementTypes type);

    ITechnicalTask CreateTechnicalTaskTemplate(string name);

    ITechnicalTask CreateTechnicalTaskDocument(
        string templateName);

    ITechnicalTaskCollection CreateTechnicalTaskCollection();

    IRepository CreateRepository();
}

当前工厂始终可以通过该ModelFactory.Current程序集属性访问因此,在我的ASP.NET Core MVC项目中没有可访问的类或构造函数

大卫派恩

你混淆了依赖注入模型绑定有一个很大的不同。请考虑执行以下操作。

注册IModelFactory为服务:

public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<IModelFactory>(ModelFactory.Current);

    // Add framework services.
    services.AddMvc();
}

现在在您的控制器中,使用FromServices获取实例并从帖子中获取使用创建模型所需的值FromForm

[HttpPost]
public IActionResult CreateTemplate([FromForm] string name, 
                                    [FromServices] IModelFactory factory)
{
    var item = factory.CreateTechnicalTaskTemplate(name);
    repo.Templates.Add(item);
    return View(nameof(TemplatesList));
}

你的工厂应该被视为一种服务。模型绑定需要 POCO,而不是接口。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么LocalDate,LocalTime和Stream对象使用工厂方法of()而不是构造函数?

来自分类Dev

Dart工厂(构造函数)与静态方法;例如,为什么int.parse()不是工厂构造函数?

来自分类Dev

静态工厂方法与公共构造函数

来自分类Dev

嵌套的构造函数。为什么需要它?

来自分类Dev

嵌套的构造函数。为什么需要它?

来自分类Dev

具有静态工厂方法或构造函数的工厂模式

来自分类Dev

为什么移动构造函数的成员需要默认构造函数?

来自分类Dev

为什么Dart的Datetime.parse不是工厂构造函数?

来自分类Dev

我的域对象在需要时可以使用工厂方法或工厂层吗?

来自分类Dev

为什么要使用单独的加载方法而不是构造函数?

来自分类Dev

为什么要使用单独的加载方法而不是构造函数?

来自分类Dev

工厂方法和构造函数之间的区别

来自分类Dev

Android片段工厂方法与构造函数重载

来自分类Dev

Android片段工厂方法与构造函数重载

来自分类Dev

强制子类具有特定的工厂方法或构造函数

来自分类Dev

在angularJS中使用工厂方法时,未定义不是函数错误

来自分类Dev

工厂方法模式 - 这种模式需要什么?

来自分类Dev

为什么std :: make_shared需要默认构造函数?

来自分类Dev

为什么需要使用unordered_map和tuple的默认构造函数?

来自分类Dev

为什么使用默认构造函数“ {}”而不是“ = default”会导致性能差异?

来自分类Dev

为什么我的班级不是默认可构造的?

来自分类Dev

如果使用工厂方法,为什么TypeToken无法捕获通用类型?

来自分类Dev

如果使用工厂方法,为什么TypeToken无法捕获通用类型?

来自分类Dev

为什么Pimple工厂方法会返回相同的实例?

来自分类Dev

什么是Ruby工厂方法?

来自分类Dev

什么是Ruby工厂方法?

来自分类Dev

需要构造函数的工厂

来自分类Dev

使用带有类型参数的工厂方法,使用参数化的构造函数创建派生类

来自分类Dev

为什么我的FormLoad事件处理程序调用自定义类的默认构造函数而不是带有参数的默认构造函数?

Related 相关文章

  1. 1

    为什么LocalDate,LocalTime和Stream对象使用工厂方法of()而不是构造函数?

  2. 2

    Dart工厂(构造函数)与静态方法;例如,为什么int.parse()不是工厂构造函数?

  3. 3

    静态工厂方法与公共构造函数

  4. 4

    嵌套的构造函数。为什么需要它?

  5. 5

    嵌套的构造函数。为什么需要它?

  6. 6

    具有静态工厂方法或构造函数的工厂模式

  7. 7

    为什么移动构造函数的成员需要默认构造函数?

  8. 8

    为什么Dart的Datetime.parse不是工厂构造函数?

  9. 9

    我的域对象在需要时可以使用工厂方法或工厂层吗?

  10. 10

    为什么要使用单独的加载方法而不是构造函数?

  11. 11

    为什么要使用单独的加载方法而不是构造函数?

  12. 12

    工厂方法和构造函数之间的区别

  13. 13

    Android片段工厂方法与构造函数重载

  14. 14

    Android片段工厂方法与构造函数重载

  15. 15

    强制子类具有特定的工厂方法或构造函数

  16. 16

    在angularJS中使用工厂方法时,未定义不是函数错误

  17. 17

    工厂方法模式 - 这种模式需要什么?

  18. 18

    为什么std :: make_shared需要默认构造函数?

  19. 19

    为什么需要使用unordered_map和tuple的默认构造函数?

  20. 20

    为什么使用默认构造函数“ {}”而不是“ = default”会导致性能差异?

  21. 21

    为什么我的班级不是默认可构造的?

  22. 22

    如果使用工厂方法,为什么TypeToken无法捕获通用类型?

  23. 23

    如果使用工厂方法,为什么TypeToken无法捕获通用类型?

  24. 24

    为什么Pimple工厂方法会返回相同的实例?

  25. 25

    什么是Ruby工厂方法?

  26. 26

    什么是Ruby工厂方法?

  27. 27

    需要构造函数的工厂

  28. 28

    使用带有类型参数的工厂方法,使用参数化的构造函数创建派生类

  29. 29

    为什么我的FormLoad事件处理程序调用自定义类的默认构造函数而不是带有参数的默认构造函数?

热门标签

归档