2013-05-10 4 views
1

필자는 필사적으로이 작업을 수행하려고합니다. WCF 서비스를 사용하여 JQuery로 AJAX를 수행했습니다.AJAX 지원 WCF 서비스에서 Autofac 사용

이제는 DI 용 Autofac을 사용하고 있으며, 지금까지는 AJAX의 기본 UI가 될 WCF 서비스를 내 UI 프로젝트에서 사용하기 전까지는 조용하게 진행되고 있습니다. 내 일반적인 웹 응용 프로그램에서는 Global.asax 'Application_Start'를 사용하여 컨테이너를 등록합니다. 이 작업은 MyBootstrapper 프로젝트에서 Boot() 메서드를 호출하여 수행합니다. Boot() 메소드는 단순히 모든 모듈을 등록합니다.

이제 WCF 서비스가 있고 'AJAX 사용 WCF 서비스'템플릿을 사용하면 서비스가 호출 된 후에 Global.asax가 호출되지 않는다는 것을 알았습니다.

이를 위해 Bootstrapper에서 내 Boot() 메소드를 호출하는 void host_Opening 메소드로 간단한 MyServiceHostFactory를 만들었습니다. 이것은 잘 될 것 같습니다. 아무것도 설정되지는 않았지만.

public class MyAsyncServiceHostFactory : ServiceHostFactory, IContainerProviderAccessor 
    { 
     static IContainerProvider _containerProvider; 

     public IContainerProvider ContainerProvider 
     { 
      get { return _containerProvider; } 
     } 

     protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses) 
     { 
      var host = base.CreateServiceHost(serviceType, baseAddresses); 
      host.Opening += host_Opening; 
      return host; 
     } 

     void host_Opening(object sender, EventArgs e) 
     { 
      // Setup Autofac stuff. 
      var container = MyBootLoader.Boot(); 
      _containerProvider = new ContainerProvider(container); 
     } 
    } 

그리고 MyBootLoader :

public static class MyBootLoader 
    { 
     public static IContainer Boot() 
     { 
      var builder = ConfigureContainer(); 
      return builder.Build(); 
     } 

     private static ContainerBuilder ConfigureContainer() 
     { 
      var builder = new ContainerBuilder(); 
      builder.RegisterType<PersonManager>().As<IPersonProvider>().InstancePerHttpRequest(); 
      return builder; 
     } 
    } 
MyAsyncService

<%@ ServiceHost Language="C#" Debug="true" Service="MyWebApp.UI.Ajax.MyAsyncService" CodeBehind="MyAsyncService.svc.cs" Factory="MyWebApp.UI.Ajax.MyAsyncServiceHostFactory"%> 

MyAsyncServiceHostFactory의

[ServiceContract(Namespace = "MyWebApp.UI.Ajax")] 
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)] 
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
    public class MyAsyncService 
    { 
     public IPersonProvider PersonManager { get; set; } 

     [OperationContract] 
     [WebGet(ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest)] 
     public List<Person> GetPersons() 
     { 
      var persons = PersonManager.GetPersons(); 
      return persons; 
     } 
    } 

마크 업 : 여기에

내 WCF 코드

내 Web.config의 :

<system.serviceModel> 
    <behaviors> 
     <endpointBehaviors> 
     <behavior name="MyWebApp.UI.Ajax.MyAsyncServiceAspNetAjaxBehavior"> 
      <webHttp /> 
     </behavior> 
     </endpointBehaviors> 
    </behaviors> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" /> 
    <services> 
     <service name="MyWebApp.UI.Ajax.MyAsyncService"> 
     <endpoint address="" behaviorConfiguration="MyWebApp.UI.Ajax.MyAsyncServiceAspNetAjaxBehavior" 
      binding="webHttpBinding" contract="MyWebApp.UI.Ajax.MyAsyncService" /> 
     </service> 
    </services> 
    </system.serviceModel> 

내가 실종 무엇, 제발? 모든 것이 끝나는 것처럼 보이지만 MyAsyncService에서 PersonManager가 NULL입니다.

+0

나는 심지어 내 MyAsyncServiceHostFactory에서 'host_opening'내 구성 요소를 등록하는 대신 내 부팅() 메서드를 호출하려고 : 내 부트 로더에서

나는 다음과 같은 추가. 따라서 두 곳을 등록하는 구성 요소가 있습니다. 그것도 작동하지 않았다. – codingjoe

+0

내 질문과 같이 보입니다. 결국 사소한 것이 아닙니다. 나는 AJAX-Enabled WCF Service 템플릿으로 Autofac DI를 시도 할 사람을 제안합니다. – codingjoe

답변

1

위키에서 IIS 호스팅 서비스에 대한 지침을 수행 했습니까?

https://code.google.com/p/autofac/wiki/WcfIntegration#IIS_Hosted_Services

당신은 일반적으로 Application_Start에 컨테이너를 구성하고 새로 지어진 컨테이너로 AutofacHostFactory.Container 속성을 설정합니다. 그런 다음 .svc 파일의 팩토리를 AutofacWebServiceHostFactory으로 설정하십시오. 어떤 이유로 팩토리를 커스터마이징해야한다면 기존의 Autofac 팩토리 구현 중 하나에서 파생되어야합니다. 이는 종속성 삽입을 담당하는 엔드 포인트에 동작을 추가합니다.

+0

감사합니다. 나는 친구의 도움을 받아 일하고있다. 집에 돌아 오면 곧 해결책을 게시 할 것입니다. 답장을 보내 주셔서 감사합니다 :) – codingjoe

0

나는 내 친구를 도와 주었고 해결책은 내 web.ui 프로젝트에 내 * .svc 파일을 보관하고 다른 UI의 코드 숨김 파일을 유지하는 것이었다. 서비스 프로젝트. 다음 파일 SVC는 내 *의 마크 업 파일에

첨가 하였다

<%@ ServiceHost Language="C#" Debug="true" Service="MyWebApp.UI.Services.MyAsyncService, MyWebApp.UI.Services" Factory="Autofac.Integration.Wcf.AutofacServiceHostFactory, Autofac.Integration.Wcf" %> 

이 있지만 새로운 조립체의 추가 비용으로 원형 기준 문제를 막았다.

public static class MyBootLoader 
{ 
    public static IContainer Boot() 
    { 
     var builder = ConfigureContainer(); 
     var container = builder.Build(); 

     AutofacHostFactory.Container = container; 

     return container; 
    } 
    private static ContainerBuilder ConfigureContainer() 
    { 
     var builder = new ContainerBuilder(); 
     builder.RegisterType<PersonManager>().As<IPersonProvider>().InstancePerHttpRequest(); 
     return builder; 
    } 
} 
관련 문제