2012-11-30 1 views
1

응용 프로그램에서 Dapper ORM을 사용하고 있습니다. Dapper의 기능이이 응용 프로그램에서 사용되고 있고 그것을 구현하여 다른 ORM으로 쉽게 대체 할 수있는 사람을 위해 Dapper 메서드로 인터페이스를 만들었습니다. DAL 레이어에서인터페이스 기반 접근 방식 또는 정적 도우미 메서드 사용

public interface IDapperRepository 
{    
    IEnumerable<T> GetAll<T>(string query, object cmdParams = null, CommandType cmdType = CommandType.Text) where T : class; 
    T GetById<T>(string query, object cmdParams = null, CommandType cmdType = CommandType.Text) where T : class; 
} 


class DapperRepository : IDapperRepository 
{ 
    public IEnumerable<T> GetAll<T>(string query, object cmdParams = null, CommandType cmdType = CommandType.Text) where T : class 
    { 
     //implementation 
    } 

    public T GetById<T>(string query, object cmdParams = null, CommandType cmdType = CommandType.Text) where T : class 
    { 
     //implementation 
    } 
} 

: 사용자 목록 페이지에서

public class UserRep : IUserRep 
{ 
    private readonly IDapperRepository _iDapperRepository; 
    public UserRep() 
    { 
     _iDapperRepository = new DapperRepository(); 
    } 

    public IEnumerable<UserBO> GetAll() 
    { 
      return _iDapperRepository.GetAll<UserBO>("select * from users"); 
    } 
    //Other methods 
} 

, _iUserRep.GetAll()는 컨트롤러에서 호출됩니다.

위의 코드에서 _iUserRep.GetAll() 또는 저장소 클래스의 다른 메서드를 호출하면 DapperRepository 클래스가 인스턴스화됩니다. 내 질문은 DapperRepository 클래스에만 유틸리티 메서드가 있기 때문에 IDapperRepository를 제거하고 DapperRepository를 "정적"메서드로 "정적"메서드로 수정하여 인스턴스화하지 않고 메서드를 호출 할 수 있도록하는 것이 좋습니다. 그렇게함으로써 성능 향상이 있는지 여부를 알고 싶습니다.

또한이 디자인을 개선하기위한 모든 의견을 환영합니다.

+0

* controller *를 언급했는데 ASP.MVC 응용 프로그램에서 일하고 있습니까? – jwaliszko

+0

예, MVC 응용 프로그램입니다. 그것은 설계상의 문제가 더 많기 때문에 그것에 대해 많이 언급하지 않았습니다. – Sunny

답변

0

바람직한 개념에 대한 질문으로, 내가 할 일을 제시 할 것입니다. 우선 추상화 및 오버 헤드 복잡성을 제한하십시오. 먼저 단순화하고 마지막으로 자동화하십시오. 다른 ORM 사용을 위해 저장소 구현을 변경하게 될 가능성이 있습니까? 그렇게하지 않으면 그러한 접근법을 사용하지 마십시오. 얼핏보기에는 괜찮은 것으로 보이는 오래된 학교 저장소 스타일이지만, 결국은 재평가되고 중복됩니다 - 제 생각에는 적어도. 이 ASP.MVC 응용 프로그램입니다, 당신은 대신 명령을 사용하여 시도 할 수 있습니다 :

public abstract class BaseController : Controller 
{ 
    public IDocumentSession DocumentSession { get; set; } 

    protected override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     DocumentSession = ...OpenSession(); // initialize and open session 
    } 

    protected override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     if (filterContext.IsChildAction) 
     { 
      return; 
     } 

     using (DocumentSession) 
     { 
      if (filterContext.Exception != null) 
      { 
       return; 
      } 

      if (DocumentSession != null) 
      { 
       DocumentSession.SaveChanges(); 
      } 
     } 
    } 

    public void ExecuteCommand(Command cmd) 
    { 
     cmd.DocumentSession = DocumentSession; 
     cmd.Execute(); 
    } 

    public TResult ExecuteCommand<TResult>(Command<TResult> cmd) 
    { 
     ExecuteCommand((Command)cmd); 
     return cmd.Result; 
    } 
} 

추상 명령 정의 :

public abstract class Command 
{ 
    public IDocumentSession DocumentSession { get; set; } 

    public abstract void Execute(); 
} 

public abstract class Command<T> : Command 
{ 
    public T Result { get; protected set; } 
} 

예 명령 구현 :

public class GetUsers : Command<IList<User>> 
{ 
    public IList<int> IDs { get; set; } 

    public override void Execute() 
    { 
     return DocumentSession.Query<User>()...; 
    } 
} 

사용 - 실행 형 컨트롤러 액션 :

[HttpGet] 
public NJsonResult GetUsers(string ids) 
{ 
    var result = ExecuteCommand(new GetUsers 
            { 
             IDs = ids 
            }); 
    //... 
} 

제 생각에는 사소한 문제가 아닙니다. 꽤 많은 고려가 필요합니다. 그것은 오 더 나은 이해를 위해, 당신은 당신의 자유 시간에 Ayende의 블로그 통과를 시도 할 수 있습니다 : 아래의 시리즈와 함께

http://ayende.com/blog/4784/architecting-in-the-pit-of-doom-the-evils-of-the-repository-abstraction-layer

(짧은 글, 정말 빨리 통과하기 위해) :

http://ayende.com/blog/153889/limit-your-abstractions-analyzing-a-ddd-application

http://ayende.com/blog/153921/limit-your-abstractions-application-eventsndash-what-about-change

http://ayende.com/blog/153953/limit-your-abstractions-application-eventsndash-proposed-solution-1

http://ayende.com/blog/154049/limit-your-abstractions-application-eventsndash-event-processing-and-rx

http://ayende.com/blog/154017/limit-your-abstractions-application-eventsndash-proposed-solution-2ndash-cohesion

http://ayende.com/blog/153985/limiting-your-abstractions-reflections-on-the-interface-segregation-principle

...여기에서 더 재미있을 시작 :

http://ayende.com/blog/154081/limit-your-abstractions-you-only-get-six-to-a-dozen-in-the-entire-app

http://ayende.com/blog/154113/limit-your-abstractions-commands-vs-tasks-did-you-forget-the-workflow

http://ayende.com/blog/154145/limit-your-abstractions-all-cookies-looks-the-same-to-the-cookie-cutter

http://ayende.com/blog/154177/limit-your-abstractions-so-what-is-the-whole-big-deal-about

http://ayende.com/blog/154209/limit-your-abstractions-refactoring-toward-reduced-abstractions

http://ayende.com/blog/154241/limit-your-abstractions-the-key-is-in-the-infrastructurehellip

http://ayende.com/blog/154273/limit-your-abstractions-and-how-do-you-handle-testing

나는 당신에게이 주제에서 다른 모습을 제공 바랍니다.

+0

일련의 기사를 제공해 주셔서 감사합니다. 완전히 다른 디자인 인 것 같습니다. 지금 당장은 응용 프로그램을 거의 다 마쳤으므로 여기에 충실해야합니다. 코드 리팩토링에 대해이 질문을했습니다. – Sunny

관련 문제