2010-06-24 5 views
1

나는 예리한 아키텍처 프로젝트를 가지고 있으며, 이것 역시 ApplicationServices를 사용하고 있습니다.S # arp에서 wcf 서비스 사용하기 아키텍처 프로젝트

wcf 서비스를 사용할 winform 클라이언트를 제공해야합니다. wcf 서비스는 차례대로 ApplicationServices를 사용합니다. 아직 winform 클라이언트에서 작업을 시작하지는 않았지만 wcf 서비스를 작업 중입니다.

Northwind 샘플 다음. 내 솔루션에서 "Wcf Service library"프로젝트와 "Wcf Service Application"프로젝트를 만들었습니다.

나는 wcf를 처음 사용하지만 모든 기본 사항을 알고 과거에 많은 웹 서비스를 사용해 왔습니다. 나는 다음과 같은 질문을 가지고있다 : -

1) 나는 왜 두 개의 프로젝트, wcf 라이브러리 및 wcf 응용 프로그램의 필요성을 알고 싶다?

2) Northwind 샘플의 ITerritoriesWcfService 인터페이스가 ICloseableAndAbortable을 상속 받았다는 것을 알아 챘습니다.

public interface ITerritoriesWcfService : ICloseableAndAbortable 

ICloseableAndAbortable의 목적은 무엇입니까?

3) 다른 클래스 TerritoriesWcfServiceClient

public partial class TerritoriesWcfServiceClient : ClientBase<ITerritoriesWcfService>, ITerritoriesWcfService 

이 클래스의 목적은 무엇인가있다?

4) TerritoriesService.svc 파일에서 Factory = "SharpArch.Wcf.NHibernate.ServiceHostFactory, SharpArch.Wcf"의 용도는 무엇입니까? 일반적으로 일반적인 wcf 서비스 응용 프로그램에서는 codebehind 특성을 사용하지만 실제로 .cs 파일은 int wcf 서비스 라이브러리 프로젝트에 있기 때문에 다음 코드가 수행하는 작업을 알고 싶습니다.

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

위의 팩토리 속성을 제거하더라도 서비스 응용 프로그램 프로젝트를 실행하고 WcfTestClient 유틸리티를 사용하여 서비스를 테스트 할 수 있습니다.

6) 서비스를 실행하고 WcfTestClient를 사용하는 경우 두 번째 호출에서 저장소에 액세스하는 두 번 메서드를 실행하면 두 번째 호출에서 ObjectDisposedException이 발생합니다.

{"Session is closed!\r\nObject name: 'ISession'."} 

저는 NHibernate 세션이 첫 번째 호출 후에 처리 될 것으로 생각합니다. 각 통화마다 어떻게 재 초기화 할 수 있습니까? 가장 좋은 방법을 알고 싶습니다.

7) 또한 나는 Northwind.Wcf.Web 프로젝트를 실행하고 디렉토리 목록 화면에 TerritoriesService.svc 파일을 클릭하면, 나는 다음과 같은 오류를 얻을

{ "방법은 유형에 '생성' 'Northwind를 '어셈블리에서'.Data.NHibernateMaps.AutoPersistenceModelGenerator Northwind.Data, 버전 = 1.0.0.0, 문화 = 중립, PublicKeyToken = null이가 '구현을 가지고 있지 않습니다. ""Northwind.Data.NHibernateMaps.AutoPersistenceModelGenerator "}

내가 왜이 오류를 던지는 지 이해할 수 없습니다. 이미 메서드가 있고 Northwind.Web도 잘 작동합니다. 나빌

답변

2

1) 엄밀히 말하면, 당신은 WCF 라이브러리와 하나의 어셈블리의 WCF 응용 프로그램 을 결합 할 수 있습니다 대기

. 이는 계약 과 구현을 하나의 어셈블리로 결합한다는 것을 의미합니다. 프록시 클래스가 당신의 서비스의 발견에서 생성되기 때문에

당신이 당신의 클라이언트 프록시 클래스를 생성하기 위해 (다시 svcutil.exe에 사용) svcutil.exe에 또는 Visual Studio를 사용하는 경우, 당신은 잘 될 것 .

그러나 DTO 시나리오 등에서 매우 일반적인 인 사용자 고유의 클래스를 사용하려면 클라이언트와 서버 모두에서 공유 라이브러리를 참조해야합니다. 공유 된 라이브러리가 라이브러리/응용 프로그램 어셈블리가 결합 된 경우 클라이언트는 범위에서 응용 프로그램 구현을 가져옵니다 ( 은 계약이 포함 된 어셈블리를 참조하기 때문에). 실제로는 원하는 내용이 아닙니다. 클라이언트는 서버에 대해 만큼 작은 정보를 알아야합니다. 계약서의 내용과 마찬가지로 계약서가 먼저 계약서에있는 것입니다.

관심사가 더 잘 분리되기 때문에 인터페이스/계약서를 구현과 분리하는 것이 가장 좋습니다. 단지 솔루션의 대부분이 필요하지 않으며 (그리고 는) 어떤 일이 어떻게되는지 알지 않아야합니다. 단지 그 무엇을 이 할 수있는 것입니다. 여기에는 개선 된 테스트 가능성과 같은 많은 이점이 있습니다. ICloseableAndAbortable의 코드 문서에서 촬영

2). 당신의 WCF 계약에 의해 구현 될 때

"그들은 다음 WCF 클라이언트 프록시와 교환 할 수 있습니다 이것은 간단 의존성 주입을 사용하고 WCF를 조롱 할 수 있습니다 서비스를 닫기/중단 할 때 WCF 클라이언트 인 경우 에 대해 걱정할 필요가 없습니다. "

나는 그것이 모두라고 생각합니다.

3) 클라이언트 클래스는 코드 설명서에 나와 있듯이 형식의 클라이언트 프록시입니다. 서버에서 호출 할 수있는 서비스 작업 인 에 해당하는 멤버가있는 강력한 형식의 클래스를 제공하는 클라이언트와 서버 간의 통신에 클라이언트와 사용할 수 있습니다.

이 클래스의 장점은 svcutil.exe 생성 된 프록시 클래스를 사용할 필요가 없다는 것입니다. 이것은 WCF 구성을 통해 을 구성하지 않는 것을 의미합니다. 이렇게하면 클라이언트에 프록시 클래스를 제공 할 수 있으므로 먼저 프록시 클래스를 생성하는 대신 서버와 즉시 통신 할 수 있습니다. 프록시 클래스에 의해 생성 된 코드를 변경하면 도 더 많이 제어 할 수 있으므로 은 실제로는 원하지 않는 것입니다.

구현 코드를 클라이언트에 제공하고 싶지 않기 때문에 인터페이스/계약서를 별도 어셈블리에 넣어야합니다.

4) 서비스 호스트 팩토리는 서비스 유형을 기반으로 서비스 인스턴스를 생성합니다. 서비스 코드를 코드 숨김 파일 이외의 위치에 넣으려는 경우 유용 할 수 있습니다. 부작용을 사용하는 경우 도 필요합니다. 계약 인터페이스를 유형으로 제공하고 SharpArch.Wcf 서비스 호스트 은 DI 프레임 워크의 을 통해 올바른 구현 클래스 유형으로 해결합니다. (캐슬 Windsor SA에서). 이것을 서비스 구현을 유지하는 방법으로 생각하면 실제로이 어디에서 왔는지 신경 쓰지 않아도됩니다.

기본 팩토리가 유형의 서비스를 해결할 수 있기 때문에이 경우 서비스는 공장에서 속성을 제거 할 때 실행됩니다. DI와 세션 관리 같은 것을 무시하고 있습니다. 정확히 SA를 가치있게 만드는 것.

5) 나는 분명히, 당신은 아마 SA와 함께 제공되는 ServiceHostFactory을 사용하는 Northwind 예제 프로젝트로 의심 번호 5 :-)

6)이 없기 때문에이 일을 생략해야합니다. 이 서비스 호스트 팩토리에서, 생성 된 각 서비스 인스턴스는 호출 된 후 Hibernate 세션을 직접 닫는 동작에 의해 확장된다. 그 자체로는 괜찮지 만 기회는 프록시 클라이언트가 Castle Windsor에 의해 일시적인 방식으로 관리되지 않는다는 것입니다. 따라서 인스턴스가 포함 된 닫힌 세션을 포함하여 인스턴스가 다시 사용됩니다. Transient 속성 (Castle.Core.TransientAttribute)으로 클라이언트 프록시 클래스를 꾸미고 Castle Windsor는 서비스 호출이 수행 될 때마다 새로운 인스턴스를 생성합니다.

분명히이 문제를 해결할 두 번째 방법이 있지만 S # arpArchitecture 코드베이스를 수정해야합니다. GitHub의 WCF connections which process more than one request fail because the nhibernate session is closed and isn't re-opened.을 참조하십시오.

7) 죄송합니다. 진심으로 모릅니다. 나는 나중에 이것을 들여다 볼지도 모른다.

+0

http://groups.google.com/group/sharp-architecture/browse_thread/thread/1f2d8910d2b22763?hl=ko – nabeelfarid

관련 문제