Как предотвратить использование базового класса .NET? - PullRequest
1 голос
/ 20 марта 2012

Я работаю над проектом, где мне нужно расширить WebClient для пользовательской реализации, MyWebClient.

Мне также нужно убедиться, что MyWebClient - единственная версия, реализованная любым разработчиком в проекте, и никто не использует базовый класс WebClient.

Можно ли предотвратить использование WebClient, учитывая, что это не код, к которому у меня есть доступ?

Ответы [ 4 ]

2 голосов
/ 20 марта 2012

В зависимости от необходимых вам функций WebClient вы можете рассмотреть возможность реализации MyWebClient в качестве прокси, который предоставляет только те методы, которые вы разрешаете использовать из WebClient члена.

Пример:

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 это было бы слишком сложно (см., например, предложение @gdoron), но поможет избежать его использования по ошибке.

Редактировать:

Из вашего последнего комментарияЯ думаю, что все, что вам нужно, - это фабрика, которая установит User Agent для всех ваших WebClient экземпляров.

Затем, в зависимости от вашей организации, вам потребуется четкое информирование о его использовании (и, возможно,инструмент поиска для поиска new WebClient() в ваших проектах).

public static class WebClientFactory
{
    public static WebClient Create()
    {
        WebClient result = new WebClient();
        result.Headers.Add("My Fancy User Agent");
        return result;
    }
}
1 голос
/ 20 марта 2012

Лучший способ сделать это - просмотреть код и убедиться, что WebClient не используется.Другим вариантом является планирование ночной задачи, извлечение из системы контроля версий и поиск по каждому файлу в проекте, чтобы увидеть, используют ли они WebClient вместо MyWebClient (это может быть проще сделать с помощью Roslyn).Суть в том, что это не проблема кода (или не должно быть), это проблема обучения.

0 голосов
/ 25 сентября 2012

Если вы используете ReSharper, вы можете использовать функцию «Поиск по шаблону» и настроить ее на автоматическое преобразование кода WebClient в MyWebClient, просто нажав волшебную комбинацию клавиш ALT + Enter!

См .: http://www.jetbrains.com/resharper/webhelp/Reference__Search_with_Pattern.html

0 голосов
/ 20 марта 2012

Если вам это действительно нужно (в чем я серьезно сомневаюсь), единственный способ сделать это - с помощью отражения.

Когда приложение запускает сканирование кода всех методов и классов в Assembly, и убедитесь, что они не используют запрещенный класс WebClient.

Полагаю, вы этого не сделаете ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...