私は、カスタム実装のためにWebClient
、MyWebClient
を拡張する必要があるプロジェクトに取り組んでいます。.NETベースクラスの使用を防ぐにはどうすればいいですか?
また、MyWebClient
がプロジェクトの開発者によって実装されており、誰もベースのWebClient
クラスを使用していない唯一のバージョンであることを確認する必要があります。
WebClient
の使用を防ぐことは可能ですか?それは私がアクセスできるコードではないと考えていますか?
私は、カスタム実装のためにWebClient
、MyWebClient
を拡張する必要があるプロジェクトに取り組んでいます。.NETベースクラスの使用を防ぐにはどうすればいいですか?
また、MyWebClient
がプロジェクトの開発者によって実装されており、誰もベースのWebClient
クラスを使用していない唯一のバージョンであることを確認する必要があります。
WebClient
の使用を防ぐことは可能ですか?それは私がアクセスできるコードではないと考えていますか?
必要WebClient
の機能に応じて、あなたはWebClient
メンバーから使用できるようにするだけのメソッドを公開プロキシとしてMyWebClient
の実装を検討できます。
例:
public class MyWebClient
{
private WebClient HiddenWebClient {get; set;}
// proxy sample
public void DownloadFile(string address, string fileName)
{
HiddenWebClient.DownloadFile(address, fileName);
}
// other proxy methods & your specific implementation come here.
}
した後、あなたは、専用のctorし、適切MyWebClient
をインスタンス化するかもしれない工場が必要になります。
これは、開発者があまりにも難しいWebClient
を使用することを妨げるものではありませんが(例えば、@godonの提案を参照してください)、誤って使用するのを避けるのに役立ちます。
編集:あなたの最後のコメントから
、私はあなたが必要とするすべては、すべてのWebClient
のインスタンスのユーザーエージェントを設定します工場だと思います。
あなたの組織によっては、その使い方についての強力なコミュニケーションが必要です(プロジェクト内でnew WebClient()
を探すための検索ツールかもしれません)。
public static class WebClientFactory
{
public static WebClient Create()
{
WebClient result = new WebClient();
result.Headers.Add("My Fancy User Agent");
return result;
}
}
私はこれを厳密に実施するための賢明な(そして簡単な)メカニズムが存在していたと私は考えていませんでした。私はそれが驚かないとは思わない。結局のところ、チームコミュニケーションには本当に影響しているようです。私はチームの誰もがそれをより明白に保つために余分なオプションが好きです! – HotN
本当に必要な場合(私はそれを真剣に疑っています)あなたがそれを行うことができる唯一の方法は反射です。
アプリケーションがAssembly
のすべてのメソッドとクラスのコードのスキャンを開始し、禁止されたWebClient
クラスを使用していないことを確認します。
私はあなたがそれをしないだろうと思います...
ああ、それが唯一の選択肢ならば、あなたは正しい。私はすべての開発者が実行時にそれを行うよりも、コードを正しく実装することを忘れないことを願っています。 – HotN
これを行う最善の方法は、すべてのコードを確認し、WebClientが使用されていないことを確認することです。別の方法として、夜間の作業をスケジュールし、プロジェクト内の各ファイルを検索してMyWebClientの代わりにWebClientを使用しているかどうかを確認する方法があります(Roslynを使用する方が簡単かもしれません)。要するに、これはコードの問題ではない(またはそうでなければならない)ことで、トレーニングの問題でなければならないということです。
ReSharperを使用している場合は、「パターンで検索」機能を使用して、魔法のALT + Enterショートカットを押すだけで、WebClient
コードをMyWebClient
に自動的に変換できるように設定できます。
は参照してください:これは臭いらしいhttp://www.jetbrains.com/resharper/webhelp/Reference__Search_with_Pattern.html
。なぜあなたは 'WebClient'の使用を防ぐ必要がありますか? –
ベースを拡張するクラスが1つしかない場合、なぜ基本クラスと子クラスを作成するのですか?コードを基底クラスから子クラスに移動し、それを使って終了します。 – Servy
@Servy私は彼がSystem.NetのWebClientが彼の基本クラスであることを意味すると思います。彼はそれを拡張しており、ユーザーが自分の拡張バージョンをインスタンス化することを確実にしたいと考えています。 –