Предоставить ответ на основе комментариев, предоставленных вчера другими пользователями. Само собой, рекомендуется добавить IOptions
в ваши фильтры или любые другие объекты, которые требуют ввода данных конфигурации.
Вы можете добавить свои настройки ERP в свой файл appSettings.json, например, так:
{
"Logging": {
"LogLevel": {
"Default": "Warning"
}
},
"AllowedHosts": "*",
"Erp": {
"Url": "https://localhost"
}
}
Чтобы добавить ваши настройки в зависимости, вы должны зарегистрировать их через ConfigureServices
, вы также заметите, что CompanyFilter
добавляется в IServiceCollection
через AddTransient
, это позволяет ServiceFilterAttribute
разрешить его на более поздней стадии и ввести любые зависимости, которые есть у фильтра.
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
services.Configure(Configuration.GetSection("Erp"));
services.AddTransient();
}
Чтобы применить фильтр к действию вашего контроллера, используйте ServiceFilterAttribute (Type) `
[HttpGet]
[ServiceFilter(typeof(CompanyFilter))]
public ActionResult> Get()
{
return new string[] { ViewBag.ERPUrl };
}
В приведенном выше коде вы увидите, что я возвращаю ViewBag.ERPUrl, это потому, что ваш ComapnyFilter
переопределил OnActionExecuting
, который выполняется до того, как будет вызвано действие, тогда как OnActionExecuted
вызывается после того, как ваше действие завершено, и до того, как ответ будет возвращен вызывающей стороне.
Вот как теперь выглядит CompanyFilter
, вы заметите, что конструктор теперь принимает IOptions
public class CompanyFilter : ActionFilterAttribute
{
private readonly ErpSettings erpSettings;
public CompanyFilter(IOptions erpSettings)
{
this.erpSettings= erpSettings.Value;
}
public override void OnActionExecuting(ActionExecutingContext context)
{
if (context.Controller is Controller controller)
controller.ViewBag.ERPUrl = erpSettings.Url;
}
}
После всего этого, это ответ
Мы используем Расширенные свойства, поскольку Вы описали это, и это работает действительно хорошо.
Я думаю, имея таблицу, излишество. Если я хочу отследить различия в своих базах данных, я использую управление исходным кодом и сохраняю все сценарии поколения дб в нем.
Я также использовал некоторые инструменты схемы ER, чтобы помочь мне отслеживать изменения в версиях DB. Это было вне реального приложения, но оно позволило мне быстро видеть то, что изменилось.
Я думаю, что это был CASEStudio или что-то как этот.
Я делаю это:
Составьте таблицу схемы:
CREATE TABLE [dbo].[SchemaVersion](
[Major] [int] NOT NULL,
[Minor] [int] NOT NULL,
[Build] [int] NOT NULL,
[Revision] [int] NOT NULL,
[Applied] [datetime] NOT NULL,
[Comment] [text] NULL)
Схема обновления:
INSERT INTO SchemaVersion(Major, Minor, Build, Revision, Applied, Comment)
VALUES (1, 9, 1, 0, getdate(), 'Add Table to track pay status')
Получите схему базы данных Версия:
SELECT TOP 1 Major, Minor, Build from SchemaVersion
ORDER BY Major DESC, Minor DESC, Build DESC, Revision DESC
Адаптированный от того, что я считал при Кодировании Ужаса
Если я понимаю Ваше право вопроса (дифференцирующийся между внутренними версиями базы данных, как номера сборки приложения), у Вас могла быть своего рода таблица SYSVERSION, которая содержала одну строку данных с этой информацией.
Легче запросить.
Мог также содержать несколько столбцов полезной информации или несколько строк, которые представляют различные времена, что копия базы данных была обновлена.
Обновление: Ну, если Вы не можете использовать таблицу для содержания метаданных, затем любая внешняя какая-то информация (Информационный файл на жестком диске?) или расширенные свойства были бы способом пойти.
Мне все еще нравится идея таблицы, хотя :) Вы могли всегда использовать безопасность, чтобы только сделать это доступным через пользовательский сохраненный proc get_ db_version или что-то.