0

ORM을 통해 부분적으로 채워지는 User 클래스가 있다고 가정 해 보겠습니다.하지만이 엔티티와 논리적으로 관련이있는 데이터가 다른 곳에서 제공됩니다.행동 주사를 법인체 또는 더 나은 방법으로?

public class User { 
    public int Id { get; set; } 

    public int ServiceId { get; set; } 

    public string FirstName => null; //this comes from somewhere else 

    public ICollection<Role> Roles { get; set; } 
    //etc... 
} 

이전에는 이와 비슷한 경우 IOC 컨테이너에서 도메인 모델에 단일 인터페이스를 주입하도록 허용했습니다.

public class User { 
    public readonly IUserBehavior _userBehavior; 

    public User() {} 
    public User(IUserBehavior userBehavior) { 
    _userBehavior = userBehavior; 
    } 

    public int Id { get; set; } 

    public int ServiceId { get; set; } 

    public string FirstName => _behavior?.getFirstName(this); 

    public ICollection<Role> Roles { get; set; } 
    //etc... 
} 

나는 그러나 최근이 불가능 (적어도, 지금까지 생성자 주입을 사용하는 등)을 보인다 엔티티 프레임 워크에 nHibernate 수로 전환했습니다.

지금 내 옵션은 실종 된 데이터를 엔티티에 직접 가져 오거나 사용하지 않는 것처럼 보이는 이중 디스패치 패턴을 사용하기 위해 서비스 호출 (구현 세부 정보)을 이동하는 것 같다. 유형의 특정 데이터 속성에는 특별한 방법으로 부르심을 받는다. 이것이 국가 변경을위한 행동을 수행했는지, 이중의 파견이 더 의미가 있다는 것을 알 수있었습니다. 또는, 다시 nHibernate로 돌아갈 수 있다고 가정합니다.

나는 내 선택 사항이 실제로 "좋다"거나 내가 고려해야 할 다른 옵션이 무엇인지 묻고있는 것 같아요?

+0

https://stackoverflow.com/questions/28715966/entity-framework-object-materialization-and- dependency-injection의 중복? – Steven

+0

@Steven이 질문을하기 전에이 질문을 봤어. 내가 말했듯이 나의 유스 케이스에 대해 이상하게 느껴지는 이중 파견을 제안하는 것 같다. – Ixonal

+0

퍼블리싱 이벤트를 시작할 때를 제외하고는 두 배 발송과 관련하여 귀하의 질문과 관련이없는 것처럼 보이지 않습니다. – Steven

답변

0

사용 장식은 필요한 기능 제공 : 귀하의 비즈니스 계층에서 그래서 https://en.wikipedia.org/wiki/Decorator_pattern

를 (또는 User 클래스에 액세스해야 할 때마다 먼저 EF를 호출하고 공급하기 위해 사용자 정의 프로세스를 사용하는 것이 데코레이터 클래스를 부를 것이다 FirstName 등.

+1

사실, 이것은 트릭을 수행 할 수 있습니다 ... – Ixonal

+0

데코레이터는 래핑 할 때와 동일한 추상화를 구현하는 클래스이기 때문에 데코레이터 패턴이 아닙니다. 당신이 설명하는 것은 빌더 또는 파이프 라인입니다. – Steven

+0

@Steven 그래서 Decorator에서 원본 데이터 클래스를 확장하고 Decorator에서 데이터를 검색 한 다음 Decorator 클래스 내에서 개인 데이터를 호출하여 추가 데이터를 검색하는 원래 함수를 호출하는 방법에 대해 생각해 보았습니다. 그것은 내게 장식 자 패턴처럼 들린다. 파이프 라인 작성기를 사용하면 Decorator와 원래 데이터 액세스 클래스를 모두 호출해야합니다. 여기서는 소비자의 데코레이터 만 호출합니다. – bc004346

0

기관에 종속성을 주입하는 생성자 주입을 사용하여, 여러 사람 here, herehere을에 의해 설명으로는 좋은 생각이 아니다.

대신 메소드 삽입을 사용하는 것이 훨씬 낫습니다. 예 :

여기 엔티티의 각 메소드는 메소드 삽입을 사용하여 주입되는 고유 한 종속성 세트를 정의합니다. 이것은 엔티티에 대한 메소드를 매우 테스트 가능하게 만들고, 엔티티가 컨테이너를 사용하여 빌드 될 필요가 없게합니다.

대신 소비하는 서비스는 필요한 종속성을 해당 생성자에 삽입하고 해당 종속성을 호출하는 메서드에 전달합니다.

그러나이 경우 GetFirstName() 메서드의 동작이 매우 간단하므로 behavior.GetFirstName(User)이라는 서비스 호출을 사용하는 것이 좋습니다.