Правильная организация проекта и архитектура для совместного использования кода в проектах Visual Studio/.NET

Я ищу рекомендации о том, как лучше всего делиться кодом между несколькими проектами Visual Studio. Я борюсь с фундаментальной темой и пытаюсь получить некоторые идеи, чтобы преодолеть это.

Мое решение имеет:

  • Несколько проектов веб-приложений
  • Несколько автономных проектов процессов, например, Windows Services и / или консольные приложения и / или Azure WebJobs

Примером функциональности, которая является общей для всех проектов, является необходимость вызова некоторого общего веб-сервиса или, например, необходимость чтения и записи из Amazon S3.

В чем я бьюсь так: очевидно, что код, который реализует общую функциональность, должен быть разбит сам по себе, например, в отдельном проекте библиотеки классов. Например, чтобы общаться с S3, код должен знать мои учетные данные Amazon, конечные точки S3 и т. Д. - все эти вещи обычно хранятся в файлах конфигурации приложения. Но мне не нравится идея помещать файлы конфигурации в проекты библиотек классов, потому что это связывает с ними конкретную реализацию. Но чтобы этого не делать, мне нужно передать эту информацию из вызывающего проекта. Так, например, файлы web.config веб-приложения и файлы app.config консольного приложения содержат эту информацию о соединении. При вызове кода S3 я бы предположительно передал эту информацию о конфигурации в общий код.

Тем не менее, это кажется мне отвратительным *, и я не уверен, почему. Мне все еще кажется, что я "привязываю" код S3 (например) к определенному методу конфигурации, если это имеет смысл. Я не уверен, является ли мое чувство неправильным уклоном.

* Например, у меня может быть произвольное количество данных конфигурации, которые должны быть переданы в:

  • Строки подключения
  • Учетные данные для веб-сервисов
  • Конечные точки API
  • Произвольные данные из настроек конфигурации моего приложения (которые понадобятся некоторым звонящим, но другим нет, поэтому много раз данные будут просто бесполезны, но я должен что-то передать)

Поэтому каждый раз, когда я добавлял переменную конфигурации в мое основное приложение, мне приходилось изменять конструктор общего кода. Вещи были бы в постоянном движении.

Можете ли вы дать мне предложения по этому поводу?

1 ответ

Мне нравится использовать объекты конфигурации в качестве параметров, поэтому сигнатура никогда не меняется, даже если вы добавляете / удаляете свойства. Например....

public class AmazonConfigSettings {
    public string AWSkey { get; set; }
    public string ApiEndpoint { get; set; }
    ......
}

Ваша подпись всегда может выглядеть так:

public MySharedClass(AmazonConfigSettings config) { .... } 

Даже если (когда) Amazon полностью пересмотрит свои настройки веб-сервиса.

Другие вопросы по тегам