我拼命想让它发挥作用。我之前没有任何喧嚣,我曾使用WCF服务与JQuery进行AJAX。
现在我正在使用Autofac进行DI,到目前为止它一直很安静,直到我希望我的UI项目中的WCF服务成为AJAX的基础。在我的常规Web应用程序中,我使用Global.asax'Application_Start'来注册我的容器。这是通过在我的'MyBootstrapper'项目中调用Boot()方法来完成的。 Boot()方法只是注册我的所有模块。
现在我注意到拥有WCF服务并使用“支持AJAX的WCF服务”模板,一旦调用服务就不会调用Global.asax。
为此我创建了一个带有void host_Opening方法的简单MyServiceHostFactory,该方法在我的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。
答案 0 :(得分:1)
您是否按照维基上的说明进行IIS托管服务?
https://code.google.com/p/autofac/wiki/WcfIntegration#IIS_Hosted_Services
您通常在Application_Start
中配置容器,并使用新构建的容器设置AutofacHostFactory.Container
属性。然后将.svc文件中的工厂设置为AutofacWebServiceHostFactory
。如果由于某种原因需要自定义工厂,则应从现有的Autofac工厂实现中派生出来。这些将行为添加到负责依赖注入的端点。
答案 1 :(得分:0)
我让我的朋友帮助我,解决方案是将我的* .svc文件保存在我的web.ui项目中,并将代码隐藏文件保存在另一个UI.Services项目中。
在我的* .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;
}
}