1

私は F# にかなり慣れていません。特に、型プロバイダーについてはまったくの初心者です。WsdlServiceタイプ プロバイダーを使用して WCF サービスからコントラクトを生成するプロジェクトに取り組んでいます。これが私のコードが今どのように見えるかです:

type myService = WsdlService<"http://services.mydomain.com/myservices.svc?wsdl">
let myClient = myService.GetIMyService_Basic()

バインド名から生成された奇妙な名前以外は、今のところ問題ないようIMyService_Basicです。ただし、サービスからのデータ コントラクトは、一連のネストされたクラスで生成されます。つまり、次のようなことをしなければなりません。

let app = new myService.ServiceTypes.My.Long.Namespace.Contracts.ApplicationReference (Name = "MyApplication")
let area = new myService.ServiceTypes.My.Long.Namespace.Contracts.AreaReference (Name = "MyArea", Application = app)
let level = new myService.ServiceTypes.My.Long.Namespace.Contracts.LevelReference (Name = "MyLevel", Area = area)
let node = new myService.ServiceTypes.My.Long.Namespace.Contracts.NodeReference (ExternalKeys = [|"123abc"|], Level = level)
let req = new myService.ServiceTypes.My.Long.Namespace.Contracts.GetChangeSetsByNodeRequest (Node = node)

let res = myClient.GetChangeSets(req).Results
printf "This node has %i total change sets" res.Length;

これはかなり醜いです。次のように、生成された型の 1 つをモジュールまたは名前空間であるかのように使用するようなことをしたいと思います。

open myService.ServiceTypes.My.Long.Namespace.Contracts // Doesn't work

let app = new ApplicationReference (Name = "MyApplication")
let area = new AreaReference (Name = "MyArea", Application = app)
let level = new LevelReference (Name = "MyLevel", Area = area)
let node = new NodeReference (ExternalKeys = [|"123abc"|], Level = level)
let req = new GetChangeSetsByNodeRequest (Node = node)

let res = myClient.GetChangeSets(req).Results
printf "This node has %i total change sets" res.Length;

これを達成する方法はありますか、少なくとも私がこれまでに得たものよりエレガントなものはありますか?

4

1 に答える 1

2

タイプの省略形を使用できます。

type AppReference = myService.ServiceTypes.My.Long.Namespace.Contracts.ApplicationReference
type AreaReference = myService.ServiceTypes.My.Long.Namespace.Contracts.AreaReference

let app = AppReference(Name="MyApplication")
let area = AreaReference(Name = "MyArea", Application = app)
于 2013-09-16T20:45:30.877 に答える