gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 18:56:33 24 4
gpt4 key购买 nike

使用 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();

}

我的 Controller 有这样的方法:

[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 按钮时出现异常:

An unhandled exception occurred while processing the request.

InvalidOperationException: Could not create an instance of type 'PikProject.RobotIRA.ITechnicalTask'. Model bound complex types must not be abstract or value types and must have a parameterless constructor.

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

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

UPD

我的业务模型位于其他项目中。它的所有类都是内部的。只有接口(interface)和一对类是public。它还定义了用于创建必要的接口(interface)实例的工厂接口(interface):

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 项目中没有可访问的类或构造函数。

最佳答案

你在混淆dependency injectionmodel binding .有一个很大的不同。请考虑改为执行以下操作。

IModelFactory 注册为服务:

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

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

现在在您的 Controller 中,使用 FromServices 获取实例并从 post 获取使用 FromForm 创建模型所需的值:

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

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

关于c# - 为什么它需要默认构造函数而不是直接使用我的工厂方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43632346/

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