2009-06-30 5 views
3

제목에서 알 수 있듯이 다중 프로젝트 솔루션이 있습니다.ASP.NET + C# 다중 프로젝트 솔루션. 글로벌 유틸리티 기능은 어디에 두어야합니까?

저는 다른 프로젝트 대부분이로드되는 "핵심"프로젝트가 있습니다.

내 질문에, 나는 FormatPhoneNumber (..)와 같은 몇 가지 유틸리티 기능을 가지고 있는데, 다음과 같은 방식으로 어디에서나 액세스 할 수 있기를 원합니다.

string str = util.FormatPhoneNumber(inputString); 
+0

주목할 것 같지 않은 것, 프로젝트 폴더를 만들 수 있습니다 (디스크의 폴더에 매핑 할 수 있거나 만들 수 없음). 나는 내 Utils 폴더에 내 Utils 라이브러리를두고, Lib 폴더에 내 Service 라이브러리를 넣는 경향이있다. –

+0

감사의 말을 전하는 시간을 보냈던 모든 분들께 감사드립니다. –

답변

4

이 일을 가장 좋은 방법은 만드는 것입니다 :

string str = FormatPhoneNumber(inputString); 

은 최악의 경우, 내가 어떤 종류의 규정에 살 수있는 가정 (Project_B에서 코어에 의존하는) dll 프로젝트 (아마도 "CommonCode"와 같은 것으로 불려지겠습니까?), 그러면이 프로젝트의 모든 프로젝트에서이 DLL을 참조하고 그 안에있는 클래스와 메소드에 액세스 할 수 있습니다.

어딘가에 "한정자"가 있어야하지만 영향을 줄이기 위해 각 파일의 맨 위에 using 문을 사용하십시오.

using util; 
+0

나는 "사용하지 마십시오"라는 말을 일반적인 지침으로 말하고 싶습니다. 특히 이와 관련없는 유틸리티 클래스를 가져 오는 경우. 긴 이름의 경우 Intellisense가 있습니다. 그것 이외에, 당신의 대답은 괜찮습니다. – OregonGhost

+0

일반적으로 네임 스페이스 밖에서 실제 utils를 남기는 것을 선호합니다. .NET 클래스에 대한 확장은 대개 여기에 포함됩니다. – annakata

0

는 C# 3.0을 사용하는 경우 확장 메서드로 사용할 하나 개의 정적 클래스에 모두 바인딩 할 수 있습니다.

+0

그러나 확장 메서드를 사용해야하는 경우 지침 : 대상 클래스의 구성원으로 속한 경우에만 목표 유형을 직접 작성). – Richard

+0

당신은 여전히 ​​그들을 어딘가에 수업에 넣고 프로젝트간에 공유해야합니다. 확장 메서드는 네임 스페이스와 물론 참조를 사용하지 않는 한 작동하지 않습니다. 또한, 확장 방법으로 자신을 제한함으로써 자신의 디자인을 가지고 있지 않습니다. 사람들은 수업을 필요로합니다. – Kobi

+0

문자열을 형식화하는 문자열 확장 방법이 좋을 것 같습니다.다른 클래스와 독점적으로 사용되는 함수에 대해 별도의 클래스가있는 것은 중요하지 않습니다. 특히 유일한 매개 변수와 반환 값이 모두 다른 유형 인 경우에는 특히 그렇습니다. – OregonGhost

0

.NET에는 전역 함수가 없으므로 유틸리티 함수를 클래스에 넣어야합니다. 당신은 방법이 정적 만들 수 있습니다, 그래서 당신은 유틸리티 클래스의 인스턴스를하지 않고 그들을 호출 할 수 있습니다 :

public class Utility 
{ 
    public static string FormatPhoneNumber(string input) 
    { 
    ... 
    } 
} 

// usage: 
string output = Utility.FormatPhoneNumber(input); 

다른 모든 도서관 (참조) 사용할 수있는 핵심 라이브러리 또는 별도의 유틸리티 라이브러리에 이러한 방법을 넣어 및 응용 프로그램.

0

정적 클래스에 함수를 넣어야합니다. 유틸리티 기능은 정상적인 방법에 따라 분류한다

<%= Formatters.PhoneNumber(rawData) %> 

: 당신은 (C#에서 전역 기능이없는) 자격을 피할 수 없다 유사한 방법이 함께 이동 관련이없는 방법은 (다른 클래스에 정적 클래스와 이벤트를 가야한다 낮은 커플 링 및 높은 응집력을 목표로 함).

각 어셈블리는 프레젠테이션 계층에서만 사용되는 형식 지정 함수 (ASP.NET 프로젝트 자체)에 속해야합니다. 진정한 공통 기능이 핵심이 될 수 있습니다.

1

정말 그런 유틸리티 기능이 있어야한다면 (알다시피, 안되지만 때로는 가장 쉽고/쉬운 솔루션입니다), 코어에서 사용하는 것이 좋습니다 (모든 단일 프로젝트가 코어 어쨌든), 또는 별도의 유틸리티 어셈블리. 별도의 어셈블리를 놓고 싶지 않으면 ILMerge 사용을 고려하십시오.

한정자는 전혀 문제가되지 않습니다. 관련이없는 함수를 Utils 클래스에 넣지 않는 것이 좋습니다. 모든 서식 지정 기능에 대해 Formatting 클래스. 반면에 s_ruchit가 제안됨에 따라 (예 : 문자열 클래스의) 확장 메소드가 유용 할 수도 있습니다.

(나요 내가 대신 인용구를 만들기 때문에이 § %의 $ & 인하 편집기, 독일의 키보드 레이아웃에 [시] 기호를 입력 할 수 없습니다 언급? 한숨.)

1

것은 자신의 폴더의 유틸리티를 만들어보십시오 도서관.
클래스 라이브러리 프로젝트를 만들고 거기에 util 클래스를 넣으십시오.

나 자신은 [회사 명] .Util 같은 명명 규칙을 준수하려고

. 하위 도메인] 귀하의 예를 것 내 [회사 명] .Utils.StringHelpers에서 아마 적합

당신은 다음과 정적 클래스 StringHelper를 만들 것 정적 메서드 FormatPhoneNumber. 이러한 개인 라이브러리가 빠르게 커질 수 있습니다. 그룹화를하면 함수의 하위 집합 만 있으면 모든 코드를로드 할 필요가 없습니다.

0

구현중인 함수가 응용 프로그램의 컨텍스트에서만 사용할 수있는 경우 코어 어셈블리 (예 : "Utils"와 같은 별도의 네임 스페이스 아래)에 배치하거나 새 DLL 라이브러리를 배치하는 것이 좋습니다 응용 솔루션. 함수가 여러 프로젝트에서 사용될 수있는 경우에만 유틸리티 라이브러리를 만드는 것이 좋습니다. 그러나 유틸리티 라이브러리가 규칙적으로 유지되는 경우에만 의미가 있습니다.

0

모든 코드에서 이러한 메서드에 액세스하려면 확장 메서드로 이동하십시오. 그렇지 않으면 코어 어셈블리의 Util 클래스로 이동하게됩니다.

FWIW, 당신은 더 정형화 된 네임 스페이스를 따르는 경우 보리스 sugguests 당신이 사용하는 키워드를 생략 할 수 있습니다 (충돌을 방지하기 위해 권장) : 가능한 한 빨리

using Util = [CompanyName].Utils.StringHelpers; 

내가 DRY principle를 따라 별칭을 생성하는 경향이 나는 그것을 한 번 이상 필요로한다.

1

확장 메서드를 사용하면 클래스 이름을 사용하지 않고 메서드를보다 쉽게 ​​호출 할 수 있습니다.

public static class Util { 
    public static string FormatPhoneNumber(this string input) { 
     : 
    } 
} 

이 메서드는 이제 모든 문자열 개체에 나타납니다. 어떤 수업이 시작되었는지 알 필요가 없습니다. 그러나 확장 클래스가 다른 네임 스페이스에서 선언 된 경우에도 네임 스페이스를 가져와야합니다.

string formattedString = inputString.FormatPhoneNumber(); 
관련 문제