【发布时间】:2013-05-10 19:21:10
【问题描述】:
我正在拼命努力让它发挥作用。我之前使用 WCF 服务通过 JQuery 进行 AJAX,没有任何麻烦。
现在我正在使用 Autofac 进行 DI,到目前为止它进展顺利,直到我希望我的 UI 项目中的 WCF 服务成为 AJAX 的基础。在我的常规 Web 应用程序中,我使用 Global.asax 'Application_Start' 来注册我的容器。这是通过在我的“MyBootstrapper”项目中调用 Boot() 方法来完成的。 Boot() 方法只是注册了我所有的模块。
现在我注意到有了 WCF 服务并使用“启用 AJAX 的 WCF 服务”模板,一旦调用该服务,就不会调用 Global.asax。
为此,我制作了一个简单的 MyServiceHostFactory,其中包含一个 void host_Opening 方法,该方法在我的 Bootstrapper 中调用我的 Boot() 方法。这似乎进展顺利。虽然什么都没有设置。
这是我的 WCF 代码:
[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;
}
}
MyAsyncService 的标记
<%@ ServiceHost Language="C#" Debug="true" Service="MyWebApp.UI.Ajax.MyAsyncService" CodeBehind="MyAsyncService.svc.cs" Factory="MyWebApp.UI.Ajax.MyAsyncServiceHostFactory"%>
MyAsyncServiceHostFactory:
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;
}
}
我的 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>
请问我错过了什么? 一切似乎都通过了,但我的 PersonManager 在 MyAsyncService 中为 NULL。
【问题讨论】:
-
我什至尝试在 MyAsyncServiceHostFactory 的“host_opening”中注册我的组件,而不是调用我的 Boot() 方法。因此有组件注册两个地方。那也没用。
-
看来我的问题毕竟不是那么微不足道。我建议有人尝试使用“启用 AJAX 的 WCF 服务”模板进行 Autofac DI。
标签: ajax wcf dependency-injection autofac