2010-04-02 5 views
4

F #에서 다음 C# 코드를 작성하는 방법은 무엇입니까? 지금까지 내가 관리하는 것처럼,하지만 난 내 자신의 기본 생성자를 선언과 동시에 PageRegistry에서 상속 해결할 수 없기 때문에F #의 생성자 재정의

namespace Shared { 
    public class SharedRegistry : PageRegistry { 
     public SharedRegistry(bool useCache = true) 
      : base(useCache) { 
      // Repositories 
      ForRequestedType<IAddressRepository>().TheDefaultIsConcreteType<SqlAddressRepository>(); 
      ForRequestedType<ISharedEnquiryRepository>().TheDefaultIsConcreteType<SharedEnquiryRepository>(); 

      // Services 
      ForRequestedType<IAddressService>().TheDefaultIsConcreteType<AddressService>(); 
      ForRequestedType<ISharedEnquiryService>().TheDefaultIsConcreteType<SharedEnquiryService>(); 
     } 
    } 
} 

.

type SharedRegistry(useCache: bool) = 
    inherit PageRegistry(useCache) 
    new() = new SharedRegistry(true) 

리치

답변

5

내가 당신의 질문을 이해 모르겠어요; 위에서 작성한 내용이 정상적으로 작동해야하는 것처럼 보입니다. 생성자 논리의 나머지 부분을 넣어 위치를 요청하는 경우,이 시도 :

type SharedRegistry(useCache) as this = 
    inherit PageRegistry(useCache) 
    do 
    this.ForRequestedType<IAddressRepository>().TheDefaultIsConcreteType<SqlAddressRepository>() 
    // etc. 
    new() = SharedRegistry(true) 

을 개별적으로 각각의 생성자를 정의하려면, 당신이 할 수있는 그것도 :

type SharedRegistry = 
    inherit PageRegistry 
    new(useCache) as this = 
    { inherit PageRegistry(useCache) } then 
    this.ForRequestedType<IAddressRepository>().TheDefaultIsConcreteType<SqlAddressRepository>() 
    // etc. 
    new() = SharedRegistry(true) 

을 또는 당신을 기본 생성자에 선택적 인수를 사용할 수 있습니다

type SharedRegistry(?useCache) as this = 
    inherit PageRegistry(defaultArg useCache true) 
    do 
    this.ForRequestedType<IAddressRepository>().TheDefaultIsConcreteType<SqlAddressRepository>() 
    // etc. 
+0

"할 일"과 "새로운"줄이 잘못 표시되었습니다. 당신의 도움을 주셔서 감사합니다. – kim3er

+0

유일한 수정안은 형식을 반환 할 때 Ignore() 메서드에서 StructureMap 메서드를 래핑하는 것입니다. – kim3er

+0

@ kim3er - 예, 값을 반환하는 함수를 호출하면 무시해야합니다. 'ignore (...) '에 모든 것을 넣는 것보다 호출 후에'|> ignore'를 사용하는 것이 더 관용적 일지 모르지만, 그 방법들은 너무 자세하게 명명되지 않기 때문에 어느 옵션도 좋지 않게 보입니다. – kvb

4

귀하의 C# 클래스는 오버로드 된 생성자 약간 다릅니다 기본 값 매개 변수를 사용합니다. 어쨌든 F #은 오버로드 된 생성자와 기본 매개 변수를 모두 지원합니다.

기본 중시하는 매개 변수의를 사용하여 코드는 다음과 같습니다 다음과 같이

type SharedRegistry(?useCache: bool) = 
    do 
     // constructor logic 
    inherit PageRegistry(defaultArg useCache true) 

는 이제 인스턴스를 만들 수 있습니다

let r1 = new SharedRegistry() // using the default value 
let r2 = new SharedRegistry(false) // specified explicitly 
let r3 = new SharedRegistry(useCache=false) // using named parameter 

을 나는 명명 된 매개 변수를 사용하는 것을 보라 약간 더 우아한 F #. 작동 방법은 매개 변수 useCache오버로드 된 생성자에 관한

(당신이 C에서 # 클래스 사용하기를 원한다면이 문제가 될 수 있습니다) 커버 하에서 option<bool>이되는 것입니다 - 볼 (귀하의 F # 코드가 정확해야을 kvb). 일반적으로 적어도 하나의 암시 적 생성자를 갖는 것이 더 좋습니다 (즉, 클래스 본문 내부의 생성자 매개 변수에 자동으로 액세스하고 let을 사용하여 필드를 선언하고 do을 사용하여 생성자 논리를 구현할 수 있음). 암시 적 생성자는 모든 매개 변수를 사용하는 생성자 여야합니다. 경우에 따라 다음과 같이 할 수있는 비공개로 설정할 수 있습니다.

type SharedRegistry private (useCache: bool) = 
    inherit PageRegistry(useCache) 
    do 
     // constructor logic 
    new() = SharedRegistry(true) 
+0

+1 내가 뭘했는지 정확히 알 수는 없지만 내가 갖고있는 또 다른 질문에 답을 해주셨습니다. – kim3er

+0

하나의 작은 nitpick ... 생성자 몸체에 추가 된 'new'는 무해하다. F #의 대부분의 경우와 같이 필수는 아니지만 원하는 경우 명시 적으로 사용할 수 있습니다. – kvb

+0

@kvb : 아, 나는 그것을 몰랐다. 수정 주셔서 감사! –