4

프로젝트를 Visual Studio 2005에서 Visual Studio 2008로 변환하는 중입니다. 위의 구문을 사용했습니다.() => construct

using Castle.Core.Resource; 
using Castle.Windsor; 
using Castle.Windsor.Configuration.Interpreters; 
using CommonServiceLocator.WindsorAdapter; 
using Microsoft.Practices.ServiceLocation; 

namespace MyClass.Business 
{ 
    public class Global : System.Web.HttpApplication 
    { 
     public override void Init() 
     { 
      IServiceLocator injector = 
       new WindsorServiceLocator(
        new WindsorContainer(
         new XmlInterpreter(
          new ConfigResource("oauth.net.components")))); 

      //ServiceLocator.SetLocatorProvider(() => injector); 

      // ServiceLocator.SetLocatorProvider(injector); 
     } 
    } 
} 

ServiceLocator.SetLocatorProvider (() injector);

이것이 무엇인지 이해할 수 있습니까?

답변

10

이것은 lambda expression입니다.

SetLocatorProvider(Func<IServiceLocator> callback): 

지금 당신이 그런 콜백을 제공해야합니다 :

은 내가 SetLocatorProvider 방법은 같은 서명이 있다고 생각한다.

방법 (항상 작업) 사용 :

private IServiceLocator GetServiceLocator() { /* return IServiceLocator */ } 

ServiceLocator.SetLocatorProvider(GetServiceLocator()); 

사용하십시오 대표을 (C# 2.0을 필요) : 세 가지 옵션은 기본적으로

ServiceLocator.SetLocatorProvider(delegate 
     { 
      // return IServiceLocator 
     }); 

람다 (requir ES C# 3.0) : 당신이 볼 코드의
...
당신이 ()를 사용하여이 작업을 지정하는 인수를 (Func<IServiceLocator>가) 만 반환 값이 없다가 있기 때문에 :

ServiceLocator.SetLocatorProvider(() => { /* return IServiceLocator */ }); 

이것은 번역 될 수 ~

아마도 this question + answer을 읽고 싶을 것입니다.

0

익명 대리자를 만드는 람다 식입니다. 즉, 함수가 인라인으로 선언되었습니다. 매개 변수 목록은 paranthesis 안에 있으므로이 경우에는 매개 변수가 없습니다. 함수가 단일 명령문을 포함 할 경우, 명령문의 값을 내재적으로 리턴합니다 (또는 아무것도 리턴하지 않음).

이 특정 경우에는 주사기를 반환하는 함수입니다. 이것은 ServiceLocator가 IoC 컨테이너를 반환하는 함수로 초기화하는 일반적인 패턴입니다.

+1

익명의 위임자는 새 위임자()와 유사 해 보입니다. {return injector; }'. lamdba 표현식은이 경우 익명의 대리자를 만드는 효과가 있습니다. –

+0

당신 말이 맞아요, 그리고 나는 서둘렀다. –

2

매개 변수없이 인라인 대리자를 만드는 것은 람다 표기법입니다.

0

이것은 생성자가 아니라 람다 식입니다. 자세한 내용은 here을 참조하십시오.

이 경우()는 Lamda 연산자 및 인젝터가 반환되는 매개 변수가 없음을 의미합니다.

2

람다입니다. 델리게이트에 익숙하다면, 메서드를 인라이닝했다는 것을 제외하고는 injector을 반환하는 메서드를 선언하고이를 위임자로 사용하는 것과 같습니다.

첫 번째 ()에는 람다에 대한 인수가 포함되어 있습니다.예를 들어, 이벤트 처리에서 종종 (src, e)을 볼 수 있습니다. 여기서 은 이벤트의 생성자이고 e은 이벤트 자체입니다. 인수는 후속 코드에서 사용할 수 있습니다.

여러 줄이면 (args) => { brackets }을 대리인 주위에 넣고 값을 반환 할 수 있습니다. 이것은 속기입니다.

+0

Visual Studio 구성으로 다시 변환하는 방법 – ferronrsmith

+0

VS2008에서 제대로 작동해야합니다. 구식으로 원한다면 람다를 메서드로 바꾸고 대신 위임자로 사용하십시오. ServiceLocator.SetLocatorProvider (CreateInjector); – Lunivore

+0

@ferronrsmith - lambda의 실제 .Net 유형은 일반 'Func <>'및'Action <>'유형입니다. 일반적인 인수는 함수 인수 (및 Func <>의 반환 형식)를 나타냅니다. 이것들은 일을 더 쉽게 사용하게 해주는 특별한 위임 클래스입니다. –

관련 문제