2016-10-28 1 views
3

私は最近、すべてのロジックを入れたいPCLクラスのXamarin Android/iOSプロジェクトに取り掛かりました。私のRefitインターフェイスのように、ReactiveUI ViewModels私のコードを実行しようとするたびに、自分のインターフェースがRefitインターフェースではないというエラーが表示されます。現在、私のインターフェースは次のようになっています。Xamarin PCL Refit 3.0.1、Refitインターフェイスのように見えない

public interface IMyApi 
{ 
    [Post("/authenticate")] 
    IObservable<Models.ApiResponses.AuthenticationResponse> SigninRaw([Body] JObject credentials); 

    [Get("/service")] 
    IObservable<Models.ApiResponses.MyListResponse> GetServiceListRaw(); 

    [Get("/service/{id}/idstatus")] 
    IObservable<Models.ApiResponses.IdResponse> GetIdStatusRaw(string Id); 
} 

は、私の知る限りでは、これはよさそうだし、これはまた、私はiOSのプロジェクトのような特定のプラットフォームからこれをロードしようとしていたときに動作します。しかし、失敗したらPCLからやろうとするとき!私は両方の私のプラットフォーム固有のプロジェクトのAndroidの&のiOSと私はPCLのDLLを参照して、私は恋に落ちたのですか?

さらに詳しい情報が必要な場合やご質問がある場合は、お気軽にお問い合わせください。 これまでの数日間、私の心を失い始めたので、読んでいただきありがとうございました。

編集:呼び出しメソッドが追加されました。 は、ここで私は私がこれを追跡するために管理してきました

var client = new HttpClient(NetCache.UserInitiated) 
{ 
    BaseAddress = new Uri("https://api.address.com") 
}; 

var api = RestService.For<IMyApi>(client); <= here it crashes 
var response = api.SigninRaw(token); 
+0

Post/Get属性をインターフェイスでコンパイルする方法を教えてください。 PCLプロジェクトにリフィットプロジェクトを追加しようとするたびに、プロジェクトタイプがサポートされていないというエラーメッセージが表示されます。これは、PCLプロジェクトでIMOが使用するポイント全体を凌駕します。あなたは誤って別の名前空間の属性を使用していませんでしたか? –

+0

@MarkFeldman私はあなたが何を意味しているのか知っています、私は同じ問題を抱えていました。私はあなたのプラットフォーム固有のプロジェクトでナゲットパッケージをダウンロードする必要があり、次にあなたのPCLプロジェクトにdllを参照する必要があり、それがうまくいくはずであることを知っている限り、誰かの記事を読んだ。しかし、私がそれをすると、私はこのメッセージを受け取ります。 msgstr "" "Refitは再インターフェイスのようには見えません" msgid。うまくいけば、これはあなたを助けることができます。ご質問がある場合はお尋ねください。 –

+0

私はまさに同じ問題を抱えて、これを自分自身で試してみました。いいです、オープンソースです...私はローカルでリポジトリをクローンし、問題を追跡します。これがうまくいかない理由は考えられません。 –

答えて

2

のViewModelからそれを呼び出して、実際に遊んでいくつかの問題があります。幸いにも、それらを回避する方法があります。

最初の問題は、最初にPCLインターフェイスが検出されていないことです。 Refitはコンパイル時にユーティリティを実行し(InterfaceStubGenerator)、インタフェースクラスのサブフォルダをスキャンし、それぞれの実装コードを生成します。これらはすべて、RestStubs.g.csという中間ファイルにパックされており、アセンブリに含まれます。ただし、このユーティリティは、Refugがnuget経由で追加されたプロジェクトでのみ実行され、PCLプロジェクトは含まれないため、これらのプロジェクトのインターフェイスは決して処理されません。解決策は、ビルド前のステップでこのユーティリティを手動で呼び出し、生成されたファイルを各プラットフォームプロジェクトに含めることです。あなたのPCLプロジェクトのプロパティ設定に移動し、事前構築の手順に以下を追加します。

..\..\..\..\packages\refit.3.0.1\tools\InterfaceStubGenerator.exe ..\..\..\ProjName.Droid\RefitStubs.cs ..\..\..\ProjName 
..\..\..\..\packages\refit.3.0.1\tools\InterfaceStubGenerator.exe ..\..\..\ProjName.iOS\RefitStubs.cs ..\..\..\ProjName 

をご使用のプラットフォームのプロジェクトのためのRefitStubs.csを生成すること、それのそれぞれのプロジェクトに各ファイルを追加します。

通常、それは別の問題のためではなく、それの終わりになるでしょう。実装を取得するために呼び出すジェネリックスは、インプリメンテーションクラスが対応するインターフェイスと同じアセンブリに存在することを前提としています。明らかに、それはPCLプロジェクトの場合ではありません。あなたはRestServiceクラスの独自のバージョンを実装する必要があり、この問題を回避するために、これはおそらく、あなたのニーズのほとんどを提供します:

public static class PclRestService 
{ 
    public static T For<T>(string hostUrl) 
    { 
     var className = "AutoGenerated" + typeof(T).Name; 
     var typeName = typeof(T).Namespace + "." + typeof(T).Name.Replace(typeof(T).Name, className); 
     var assembly = System.Reflection.Assembly.GetExecutingAssembly(); 
     var generatedType = assembly.GetType(typeName); 
     var requestBuilder = RequestBuilder.ForType<T>();   
     var client = new HttpClient(new HttpClientHandler()) { BaseAddress = new Uri(hostUrl) }; 
     return (T)Activator.CreateInstance(generatedType, client, requestBuilder); 
    } 
} 

あなたがそのようにようにそれを呼び出す:

var netService = PclRestService.For<IMyApi>("http://jsonplaceholder.typicode.com"); 
var result = await netService.GetDataOrSomething(); 

一つの最後の問題、あなたをStubファイルの先頭に宣言されているPreserveAttributeクラスの複数の宣言が発生する可能性があります。限り、あなたのプラットフォームのプロジェクトに修理されたインターフェースを追加しないと、これは起こるべきではありませんが、それがその後ない場合は、3つのオプションがあります:

  1. そのコードに
  2. 書き込みaを作成しないためにInterfaceStubGeneratorユーティリティを変更しますそれは
  3. 生成された後に出てそのコードを除去するためのプリプロセッサは、修理されたツールのフォルダがスタブを生成するために使用されるテンプレートファイルが含まれて"<Exec Command="$(RefitExecCmd)" />

ラインを修理の「refit.targets」ファイルに移動し、コメントアウトファイルがいくつかの奇妙な理由でそれは無視されます赤色であり、アプリケーションに静的にリンクされているので、ツールフォルダ内で編集することはまったく何もしません。

+1

すばらしい答えありがとう!しかし、これを稼働させるにはクレイジーが複雑です。 Aiはなぜ彼らにPCLサポートがないのですか? – cfl

+0

興味深いことに私は12月にXamarin Hackdayに戻り、この問題がないと言っている少数の人に話しかけていました。彼らの環境と唯一の違いは、Visual Studio for Windows上にあって、Mac用のXamarin Studio上にあったことです。 Go figure。 –

+2

奇妙なエイ..非常にイライラ - 大規模な問題ねえ。自分でMacを買う;) – cfl

関連する問題