The problem of integrating WCF with Sharp architecture

I am working with an application that uses wcf and a sharp architecture, I am trying to create a service for writing to the database. Here is my service:

[ServiceContract] public interface IFacilitiesWcfService : ICloseableAndAbortable { [OperationContract] void AddFacility(string facility); } [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] class FacilitiesWcfService:IFacilitiesWcfService { public FacilitiesWcfService(IRepositoryWithTypedId<Facility,string> facilityRepository) { Check.Require(facilityRepository != null, "facilityRepository may not be null"); this.facilityRepository = facilityRepository; } private readonly IRepositoryWithTypedId<Facility,string> facilityRepository; public void AddFacility(string facility) { facilityRepository.DbContext.BeginTransaction(); Facility newFacility = new Facility(); newFacility.SetAssignedIdTo(facility); newFacility.NAME=facility; newFacility.ADDRESS = facility; facilityRepository.DbContext.CommitTransaction(); } public void Abort() { } public void Close() { } } 

And the LogisticsWCF.svc file in the web project:

 <%@ ServiceHost Language="C#" Debug="true" Service="Project.Wcf.FacilitiesWcfService" Factory="SharpArch.Wcf.NHibernate.ServiceHostFactory, SharpArch.Wcf" %> 

I created a client with svcutil.exe http://localhost:1905/LogisticsWCF.svc?wsdl , and then created this test case:

 [TestFixture] class WCFLogisticsTests { [Test] public void CanAddFacility() { FacilitiesWcfServiceClient facility = new FacilitiesWcfServiceClient(); facility.AddFacility("NEW"); facility.Close(); } } 

But I get this exception:

 TestCase 'Tests.Project.Web.WCFLogisticsTests.CanAddFacility' failed: System.ServiceModel.FaultException`1[System.ServiceModel.ExceptionDetail] : The needed dependency of type FacilitiesWcfService could not be located with the ServiceLocator. You'll need to register it with the Common Service Locator (CSL) via your IoC CSL adapter. Server stack trace: at System.ServiceModel.Channels.ServiceChannel.ThrowIfFaultUnderstood(Message reply, MessageFault fault, String action, MessageVersion version, FaultConverter faultConverter) at System.ServiceModel.Channels.ServiceChannel.HandleReply(ProxyOperationRuntime operation, ProxyRpc& rpc) at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout) at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs) at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation) at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message) Exception rethrown at [0]: at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg) at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type) at IFacilitiesWcfService.AddFacility(String facility) C:\Documents and Settings\epena\My Documents\SVN\Project\tests\Project.Tests\FacilitiesWcfService.cs(58,0): at FacilitiesWcfServiceClient.AddFacility(String facility) WCFLogisticsTests.cs(18,0): at Tests.Project.Web.WCFLogisticsTests.CanAddFacility() 0 passed, 1 failed, 0 skipped, took 4.52 seconds (NUnit 2.5.2). 

I think I am missing some sharp architecture configuration, because when I do not use Factory="SharpArch.Wcf.NHibernate.ServiceHostFactory, SharpArch.Wcf" in the .svc file, I do not get an exception, but I can not write anything to the database (I get an exception other than ISession).

I tried to follow the example of Northwind, but it does not work, what can I lose?

+4
source share
2 answers

Finally, I found the answer, I skipped the following line in ComponentRegistrar:

 container.AddComponent("facilityWcfService", typeof(FacilitiesWcfService)); 
+3
source

You are not returning anything from your service method, so you need to mark it as IsOneWay = true:

 [ServiceContract] public interface IFacilitiesWcfService : ICloseableAndAbortable { [OperationContract(IsOneWay=true)] void AddFacility(string facility); } 

By default, WCF expects a request / response, that is, it expects a response from a service method. "void" is not considered an answer, so just mark those service methods that do not return anything with IsOneWay=true , and you should be fine.

+1
source

All Articles