MVC의 유틸리티 클래스-ASP.NET


15

그래서 오늘 궁금합니다. ASP.NET MVC 앱에서 유틸리티 클래스를 어디에 두겠습니까? 유틸리티 클래스 란 정적 일 수 있고 함수를 수행하는 데 사용되는 클래스를 의미합니다. 이메일 주소, 제목 및 본문을 인수로 사용하는 이메일을 보내는 클래스와 같습니다.
별도의 폴더와 네임 스페이스를 만드는 것이 충분할 것이라고 생각하지만 모든 사람의 의견을 얻고 싶었습니다.


3
모든 유형의 프로젝트에서 유틸리티 클래스를 작성하는 이유는 무엇입니까? 귀하의 질문에 MVC가 왜 언급되어 있습니까?
— Oded

1
글쎄, MVC는 구조를 강제로 수행하기 때문에 궁금합니다. 그리고 유틸리티에 관한 한, 나는 모든 사람들이 그것들을 사용했다는 인상을 받았다. :) 이메일 발신자 코드가 있고 그것을 시스템의 다양한 부분과 함께 작동하도록 별도의 클래스로 나누면 유틸리티 클래스가 아닌가? 혼란스러워? 나는 유틸리티 클래스 코드에 연결되지 않은 프로그램에 한 번 재사용 생각했다
— user60812

개인적으로 유틸리티를 사용하지 않는 적절한 오류 처리, smtp 구성 등으로 IUserNotificationSender 인터페이스 등으로 추상화 된 서비스를 보내는 이메일을 개인적으로 고려할 것입니다.
— Max

@Max 그렇다면 유틸리티 기능으로 간주되는 것은 무엇입니까? 나는 매우 혼란스러워 이해하려고 노력하고있다
— user60812

글쎄, 내 생각에 적절한 유틸리티 함수는 정의 된 범위와 외부 의존성이없는 매우 작은 함수입니다 ... 공백을 제거하거나 문자열을 자르거나 컬렉션의 n 번째 요소를 얻는 함수와 같은 ...
— Max

답변:


11

당신은하지 않습니다. 그리고 당신 자신의 예는 왜 그렇지 않은지를 보여줄 수있는 완벽한 예입니다.

이메일을 보내시겠습니까? 따라서 정적 클래스 CommunicationUtilities가있는 정적 클래스를 생성 할 수 있습니다 SendEmail(). 예를 들어 사용자의 비밀번호를 재설정하고 이메일로 새 비밀번호를 보내는 등 여러 가지 작업을 수행하는 일부 클래스에서이 메소드를 사용합니다. 완전한.

수업을 단위 테스트하려면 어떻게됩니까? 암호를 재설정하는 방법을 테스트 할 때마다 데이터베이스가 변경되고 (단위 테스트에 적합하지 않음) 전자 메일을 보냅니다 (더 나쁜).

단위 테스트를보다 쉽게 ​​수행 할 수있는 제어 반전에 대해 읽었을 수 있습니다. IoC 관련 기사에서는 다음과 같은 작업을 수행하는 대신 설명합니다.

void ResetPassword(UserIdentifier userId)
{
    ...
    new MailSender().SendPasswordReset(userMail, newPassword);
}

당신은 :

void ResetPassword(IMailSender sender, UserIdentifier userId)
{
    ...
    sender.SendPasswordReset(userMail, newPassword);
}

모의와 스텁을 사용할 수 있습니다.

에 IoC를 적용 해보십시오 CommunicationUtilities. 그렇습니다. 그것이 고장난 이유입니다.


안녕하세요 MainMa, 올바르게 이해한다면 모든 배관으로 말 배경 클래스를 만든 다음 인터페이스로 추상화하고 인터페이스에서 클래스로 직접 호출하는 대신 인터페이스를 함수에 전달하는 것이 좋습니다.
— user60812

1
@ user60812 : 요컨대, IoC에 대해 읽으십시오. 간단한 주제로 전체 주제를 설명하기는 어려울 것입니다.
— Arseni Mourzenko

1
문자열 잘림과 같은 진정한 범용 유틸리티 기능은 어떻습니까?
— jbyrd

2
@MainMa-죄송합니다. 팔로우하지 않습니다. 그것은 내가 원하는 것을 따라갑니다. 그러나 Truncate ()는 c #에 내장되어 있지 않으므로 일종의 유틸리티 클래스에서 이러한 종류의 일반 유틸리티 함수를 고수하는 것이 합리적인지 궁금합니다.
— jbyrd

2
이 답변은이 특별한 경우에 util 클래스가 필요하지 않음을 지적함으로써 문제를 정의합니다. 그러나 일반적으로 어느 곳에도 맞지 않는 "도우미"스타일 방법이 항상 있습니다.
— usr

9

주어진 예제가 아니더라도 질문은 유효합니다. Maina가 제공 한 답변은 매우 " 정확한 " 클래스에 대한 적절한 컨텍스트 인 매우 구체적인 컨텍스트에서 완벽 합니다.

개인적으로 Helpers확장 기능과 같이 어디에서나 간단한 함수를 호출 하는 폴더 를 만듭니다. 이 경우 정적입니다.

이제 더 좋은 방법이 있다면 배우게되어 기쁩니다.

  • Extensions에는 아무런 문제가 없습니다.
  • 특정 폴더로 그룹화하는 데 아무런 문제가 없습니다.

이제 확장은 구문 설탕 일 뿐이며 고전적인 함수 일 수도 있습니다.


6

이전에 제공된 답변 중 실제 질문에 대한 답변은 없습니다. user60812는 MVC 프로젝트 내부에 유틸리티 클래스를 어디에 둘 것인지 물었습니다. 모든 사람들은 단수의 예를 찾아 가서 당면한 질문을 제외한 모든 것에 대해 도망 쳤다.

@ user60812, 원하는 추상화 수준에 따라 다음을 수행합니다.

  • A) 폴더를 만들고 해당 폴더 내에 유틸리티 클래스를 만듭니다
  • B) 유틸리티 클래스를 보유 할 프로젝트를 작성하십시오 (조립품 재사용을 원한다고 가정).
  • C) 유틸리티를 서비스 아키텍처로 외삽하고 호출하십시오.

다음은 더 나은 답변이있는 유사한 질문에 대한 링크 입니다.

이모


1

유틸리티에 대한 정적 클래스를 작성하지 마십시오. 대부분의 경우 정적은 좋지 않습니다. 그들도 관리자라고 부르지 마십시오. 어떤 작업을하든 논리적 네임 스페이스에 배치해야합니다.

예를 들면 다음과 같습니다.

namespace Application.Notifications.Email
{
   public interface ISendEmailCommand
   {
      void Execute(Email email);
   }
}

이메일 주소, 제목 및 본문은 별도의 관심사이므로 클래스 구조가 있으므로 Email email위의 예에서 사용한 이유 입니다.


정적 클래스가 유틸리티 메소드를 보유하기 어려운 이유를 설명하십시오. 나는 당신의 추론에 대해 정말로 궁금합니다.
— 스펜서 설리반
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.