2009-03-16 2 views
2

私たちは使用するWebサービスフレームワークを持っています。私は作成に関与しておらず、修正する能力がありません。基本的には、クッキーカッターコードがフレームワークに「モジュール」を追加する必要があります。コードの形式のサンプルは以下のとおりです。なぜ私は名前の衝突を経験していますか

以下の例では、同じ名前の2つのクラスがあることを認識せずに、数ヶ月以下の各クラスにHelperクラスを追加しました。コードは正常にコンパイルされますが、Webサーバーにデプロイされると実行時エラーが発生します。いずれかのProcessor_ProcessCompletedイベントハンドラがヒットした場合、タイプHelperのオブジェクトをHelperにキャストできないことを示す無効キャスト例外がスローされます。

私はこのエラーを理解してから、Helperクラスを再調整して状況を改善しました。これらのヘルパークラスは、自分のクラスの外部では決して参照されません。プライベートな子クラスであり、異なる名前空間にあり、どちらの名前空間もどちらの名前空間も参照しません。私の質問は、なぜこの衝突が起こっているかです。

明らかに私は間違っていますが、彼らを親クラスに非公開かつ内部的に宣言するという単なる行為は、それらがすべての衝突の可能性から隔離されていると考えました。


namespace NameSpace1 
{ 
    public class Client1 
    { 
    Processor processor; 

    private class Helper 
    { 
     public Property1 { get; set; } 
     public Property2 { get; set; } 
    } 

    public Client1(Processor p) 
    { 
     processor = p; 
     processor.ProcessCompleted += Processor_ProcessCompleted; 
    } 

    void Processor_Process(object sender, ProcessCompletedEventArgs e) 
    { 
     Helper helper = (Helper)e.UserState; 
     // ... do a bunch of stuff 
    } 
    } 
} 

namespace NameSpace2 
{ 
    public class Client2 
    { 
    Processor processor; 

    private class Helper 
    { 
     public Property1 { get; set; }  
    } 

    public Client2(Processor p) 
    { 
     processor = p; 
     processor.ProcessCompleted += Processor_ProcessCompleted; 
    } 

    void Processor_Process(object sender, ProcessCompletedEventArgs e) 
    { 
     Helper helper = (Helper)e.UserState; 
     // ... do a bunch of stuff 
    } 
    } 
} 

日時ジョンスキート:ジョン、返信いただきありがとうございます。この場合、すべてのクライアントが同じプロセッサを使用します。それらのすべてはイベントハンドラをイベントに割り当てます。私はあなたが何を言っているのか理解していますが、キャストは特定のメソッドのコンテキストで行われるため、メソッドのコンテキストから特定のタイプを推測できるように見えます。

ヘルパーの割り当て先に関しては、プロセッサ自体は実際にEventArgsに何が入っているかを実際には見ません。プロセッサーにはちょうどobjectです。非同期呼び出しは次のようになります。


    processor.Process(request, helper); 

これはレスポンスでキャストしようとしているのと同じクラスの内部に発生します。ヘルパーには、サービスが実行パスを決定するために使用する単純なデータが含まれています。

Jonの編集に編集: Jon、私は今問題を見ると思う。フレームワークの設計者は、すべてのクライアントが同じプロセッサを使用できるように特別に設計しました。したがって、私はあなたが完全にすべての購読クライアントのために解雇されているイベントについて正しいと思います。実際、クライアントを使用している人は次のようなコードを書いています:


Processor processor = new Processor(); 
Client1 client1 = new Client1(processor); 
Client2 client2 = new Client2(processor); 

client1.ExecuteSomeRequest(); // calls processor.Process(request, helper); 
client2.ExecuteSomeOtherRequest(); // calls processor.Process(request, helper); 

私は勤勉で包括的な答えに感謝します。

答えて

3

いいえ、両方のクライアントが少なくともProcessorにイベントハンドラを追加してしまう可能性があります。少なくとも、提供したコードを使用してください。両方とも、e.UserStateHelperにキャストしようとし、そのうちの1つだけが正しいでしょう。 UserStateを設定することは何ですか、それを設定するHelperの種類を知ることはどういう意味ですか?同じProcessを複数のClientに渡すことは決してありませんか?

編集:すべてのクライアントが同じプロセッサを使用している場合は、すべてのクライアントが同じイベントに登録されている可能性があります。

UserStateのビットについては、processor.Process(request, helper);と呼ばれていますが、誰がその呼び出しを行い、正確なタイプはhelperであると説明しましたか?

I 容疑者問題はそんなに前のクライアントはまだ彼らのイベントハンドラは、新しいクライアントでも、解雇持っている、同じプロセッサオブジェクトを再利用によるものであるが、それは完全な画像なしで知るのは難しいです。

問題を示す短い完全なプログラムを作成できれば、それは役に立ちます。

+0

Jonさん、ありがとうございます。私はもう少し情報を提供するために投稿を更新しました。 –

関連する問題