Доступ к appsettings.json из разных проектов - PullRequest
0 голосов
/ 02 июля 2018

Я использую .Net Core 2.1 для создания веб-API. Мое решение содержит разные проекты, и в основном / начальном проекте есть один файл appsettings.json. Я хочу читать appsettings из разных проектов. Для этого я создал класс в общем проекте, на который ссылаются все остальные проекты.

namespace Common
{
    public sealed class ApplicationSettings
    {
        public ApplicationSettings(IConfiguration configuration)
        {
            InitSettings(configuration);
        }

        public string CloudStorageConnectionString { get; private set; }

        private void InitSettings(IConfiguration configuration)
        {
            CloudStorageConnectionString = configuration["CloudStorageAccountConnection"];
        }
    }
}

Затем я пытаюсь настроить это в классе запуска в проекте запуска-

public Startup(IConfiguration configuration)
{
    Configuration = configuration;
}

public IConfiguration Configuration { get; }

// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

    //I can read the AppSettings values here via Configuration..

    var settings = new ApplicationSettings(Configuration);
    services.AddSingleton(settings);
}

Наконец, используя его -

public class ToolService : IToolService
{
    private DataContext _dataContext = null;
    private readonly Common.ApplicationSettings _settings;
    public ToolService()
    {
        _dataContext = new DataContext();
    }

    public ToolService(Common.ApplicationSettings settings)
    {
        _settings = settings; //settings is null here
    }

    public ToolDetailModel ReadToolDetail(int toolDetailID)
    {
        ToolDetailModel toolDetailModel = null;
        try
        {
            var cloudConnection = _settings.CloudConnectionString; //settings is null here      
            //...
        }
        catch
        {

        }
        return toolDetailModel;
    }
}

Вот как я вызываю вышеуказанную функцию, опять же в моем контроллере API, который находится в главном проекте запуска -

public class ValuesController : ControllerBase
{
    // GET api/values
    [HttpGet]
    public ActionResult<IEnumerable<string>> Get()
    {
        IToolService _toolService = new ToolService();
        _toolService.ReadToolDetail(1);
        //...
        return new string[] { "value1", "value2" };
    }
}

Объект AppSettings имеет значение null, когда я пытаюсь использовать их в другом проекте, передавая их в качестве параметра (используя Dependency Injection, как показано выше).

Я делаю это неправильно? Пожалуйста, дайте мне знать, если я могу добавить больше деталей.

1 Ответ

0 голосов
/ 02 июля 2018

Вы определили два конструктора для ToolService, и в данный момент вы вызываете неправильный конструктор в вашем другом проекте. Вы должны изменить его так, чтобы у вас был только один конструктор:

public ToolService(Common.ApplicationSettings settings)
{
    _dataContext = new DataContext();
    _settings = settings; //settings is null here
}

Если вы хотите, чтобы ваша библиотека классов использовала внедрение зависимостей, вам нужно зарегистрировать ее в коллекции services, например

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

    //I can read the AppSettings values here via Configuration..

    var settings = new ApplicationSettings(Configuration);
    services.AddSingleton(settings);

    // use whatever lifetime you prefer
    services.AddScoped<ToolService>();
}

Теперь, когда вы попытаетесь вызвать new ToolService(), он будет жаловаться, что вам нужно указать параметр ApplicationSettings. Проблема в том, что вы не можете использовать new ToolService(), если вы используете внедрение зависимостей. Вам нужно попросить инжектора зависимости создать класс для вас. В случае с ASP.NET Core это интерфейс IServiceProvider.

Вы не показываете, где вы создаете класс ToolService. Если он находится в классе, зарегистрированном в ConfigureServices, то вы можете просто передать ToolService в качестве параметра конструктора, и инжектор зависимостей разрешит для вас ссылку, включая параметр ApplicationSettings, который хочет класс ToolService например,

public class MyClass
{
    public MyClass(ToolService toolService)
    {
        _toolService = toolService;
    }

    public void MyMethod()
    {
        _toolService.ReadToolDetail(1);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...