내 팩토리 메서드를 직접 사용하는 대신 기본 생성자가 필요한 이유는 무엇입니까?

안드레이 부시 먼

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

"= default"대신 기본 생성자 "{}"를 사용하는 성능 차이가있는 이유는 무엇입니까?

분류에서Dev

내 도메인 개체가 필요할 때 팩토리 메서드 또는 팩토리 레이어를 사용하는 것이 괜찮습니까?

분류에서Dev

이 라이브러리를 사용하는 데 내부 헤더가 필요한 이유는 무엇입니까?

분류에서Dev

Redux 저장소에서 작업을 트리거하기 위해 직접 메서드 호출 대신 문자열을 사용하는 이유는 무엇입니까?

분류에서Dev

JavaScript에서 프로토 타입의 요점은 무엇입니까? 생성자에 직접 메소드를 추가하지 않는 이유는 무엇입니까?

분류에서Dev

사용자에게 상위 디렉토리에 대한 쓰기 권한이 없는데 chmod가 파일에서 성공하는 이유는 무엇입니까?

분류에서Dev

값을 직접 할당하는 대신 정적 생성자에서 정적 변수를 초기화하는 이점은 무엇입니까?

분류에서Dev

이 기본 반응 응용 프로그램에서 사용자 지정 구성 요소 'TextInput'을 사용하여 일반 '입력'필드가 입력하지 않는 경우에도 내용을 입력 할 수있는 이유는 무엇입니까?

분류에서Dev

기본 JQuery UI 자동 완성 대신 서버에서 직접 자동 완성을 실행하는 방법은 무엇입니까?

분류에서Dev

MVC에서 제공하는 기본 기능이 이미 있는데 colntroller 메서드를 호출하는 Ajax / jQuery가 필요한 이유는 무엇입니까?

분류에서Dev

내 사용자 정의 RPM이 필요할 때 yum이 RPM의 최신 릴리스를 설치하지 않는 이유는 무엇입니까?

분류에서Dev

내 사용자 정의 RPM이 필요할 때 yum이 RPM의 최신 릴리스를 설치하지 않는 이유는 무엇입니까?

분류에서Dev

내 HTML 생성자 객체가 [HTMLElementElement] 대신 [object Object]를 반환하는 이유는 무엇입니까?

분류에서Dev

복사 생성자가 입력 개체가 자신을 가리키는 지 여부를 확인할 필요가없는 이유는 무엇입니까?

분류에서Dev

Windows가 내 사용자 폴더에서 불필요한 .regtrans-ms 파일을 계속 재생성하는 이유는 무엇입니까?

분류에서Dev

FIFO 기반으로 처리하는 대기열이 있는데 BFS의 경우 내부 크기 루프가 필요한 이유는 무엇입니까?

분류에서Dev

내 공개 Cocoa 포드 저장소에 내 github 페이지로 직접 리디렉션하는 대신 cocoapods.org에 대한 설명서를 만드는 방법은 무엇입니까?

분류에서Dev

스토리 보드보기의 문서 개요 필터에 대한 Xcode 바로 가기는 무엇입니까?

분류에서Dev

오류를 피하기 위해 F 접미사가 필요한 이유는 무엇입니까?

분류에서Dev

내 메서드가 무한대를 반환하는 이유는 무엇입니까?

분류에서Dev

Argparse가 생성하는 기본 도움말 메시지 대신 사용자 지정 메시지를 표시하는 방법은 무엇입니까?

분류에서Dev

기본 OS를 기반으로 파생 클래스에 대한 팩토리 메서드에서 유효한 포인터를 반환하는 방법

분류에서Dev

XMVECTOR를 직접 사용하는 대신 XMFLOAT로 변환하는 이유는 무엇입니까?

분류에서Dev

SwiftUI에서 NavigationLink에 대한 팩토리 메서드를 만드는 방법은 무엇입니까?

분류에서Dev

C ++에서 참조로 객체를 전달하기 위해 기본 생성자가 필요한 이유는 무엇입니까?

분류에서Dev

AWS : API 요청을 ALB로 직접 라우팅하는 대신 CloudFront를 사용하는 이유는 무엇입니까?

분류에서Dev

비 정적 생성자 내에서 정적 읽기 전용 필드 객체에 대해 SendCompletedEventHandler를 정의 할 수있는 이유는 무엇입니까?

분류에서Dev

기본 클래스 포인터가 파생 클래스의 재정의 된 메서드 대신 기본 클래스의 순수 가상 메서드를 가리키는 이유는 무엇입니까?

분류에서Dev

JavaScript 함수 본문 내에서 await를 호출하는 데 비동기가 필요한 이유는 무엇입니까?

Related 관련 기사

  1. 1

    "= default"대신 기본 생성자 "{}"를 사용하는 성능 차이가있는 이유는 무엇입니까?

  2. 2

    내 도메인 개체가 필요할 때 팩토리 메서드 또는 팩토리 레이어를 사용하는 것이 괜찮습니까?

  3. 3

    이 라이브러리를 사용하는 데 내부 헤더가 필요한 이유는 무엇입니까?

  4. 4

    Redux 저장소에서 작업을 트리거하기 위해 직접 메서드 호출 대신 문자열을 사용하는 이유는 무엇입니까?

  5. 5

    JavaScript에서 프로토 타입의 요점은 무엇입니까? 생성자에 직접 메소드를 추가하지 않는 이유는 무엇입니까?

  6. 6

    사용자에게 상위 디렉토리에 대한 쓰기 권한이 없는데 chmod가 파일에서 성공하는 이유는 무엇입니까?

  7. 7

    값을 직접 할당하는 대신 정적 생성자에서 정적 변수를 초기화하는 이점은 무엇입니까?

  8. 8

    이 기본 반응 응용 프로그램에서 사용자 지정 구성 요소 'TextInput'을 사용하여 일반 '입력'필드가 입력하지 않는 경우에도 내용을 입력 할 수있는 이유는 무엇입니까?

  9. 9

    기본 JQuery UI 자동 완성 대신 서버에서 직접 자동 완성을 실행하는 방법은 무엇입니까?

  10. 10

    MVC에서 제공하는 기본 기능이 이미 있는데 colntroller 메서드를 호출하는 Ajax / jQuery가 필요한 이유는 무엇입니까?

  11. 11

    내 사용자 정의 RPM이 필요할 때 yum이 RPM의 최신 릴리스를 설치하지 않는 이유는 무엇입니까?

  12. 12

    내 사용자 정의 RPM이 필요할 때 yum이 RPM의 최신 릴리스를 설치하지 않는 이유는 무엇입니까?

  13. 13

    내 HTML 생성자 객체가 [HTMLElementElement] 대신 [object Object]를 반환하는 이유는 무엇입니까?

  14. 14

    복사 생성자가 입력 개체가 자신을 가리키는 지 여부를 확인할 필요가없는 이유는 무엇입니까?

  15. 15

    Windows가 내 사용자 폴더에서 불필요한 .regtrans-ms 파일을 계속 재생성하는 이유는 무엇입니까?

  16. 16

    FIFO 기반으로 처리하는 대기열이 있는데 BFS의 경우 내부 크기 루프가 필요한 이유는 무엇입니까?

  17. 17

    내 공개 Cocoa 포드 저장소에 내 github 페이지로 직접 리디렉션하는 대신 cocoapods.org에 대한 설명서를 만드는 방법은 무엇입니까?

  18. 18

    스토리 보드보기의 문서 개요 필터에 대한 Xcode 바로 가기는 무엇입니까?

  19. 19

    오류를 피하기 위해 F 접미사가 필요한 이유는 무엇입니까?

  20. 20

    내 메서드가 무한대를 반환하는 이유는 무엇입니까?

  21. 21

    Argparse가 생성하는 기본 도움말 메시지 대신 사용자 지정 메시지를 표시하는 방법은 무엇입니까?

  22. 22

    기본 OS를 기반으로 파생 클래스에 대한 팩토리 메서드에서 유효한 포인터를 반환하는 방법

  23. 23

    XMVECTOR를 직접 사용하는 대신 XMFLOAT로 변환하는 이유는 무엇입니까?

  24. 24

    SwiftUI에서 NavigationLink에 대한 팩토리 메서드를 만드는 방법은 무엇입니까?

  25. 25

    C ++에서 참조로 객체를 전달하기 위해 기본 생성자가 필요한 이유는 무엇입니까?

  26. 26

    AWS : API 요청을 ALB로 직접 라우팅하는 대신 CloudFront를 사용하는 이유는 무엇입니까?

  27. 27

    비 정적 생성자 내에서 정적 읽기 전용 필드 객체에 대해 SendCompletedEventHandler를 정의 할 수있는 이유는 무엇입니까?

  28. 28

    기본 클래스 포인터가 파생 클래스의 재정의 된 메서드 대신 기본 클래스의 순수 가상 메서드를 가리키는 이유는 무엇입니까?

  29. 29

    JavaScript 함수 본문 내에서 await를 호출하는 데 비동기가 필요한 이유는 무엇입니까?

뜨겁다태그

보관