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.