Autfa c сервис инъекций, у которого есть параметр в конструкторе - PullRequest
0 голосов
/ 05 марта 2020

Я понимаю, как вставить обнуляемый параметр в конструктор, используя TypedParameter в autofa c документах . Я изо всех сил пытаюсь понять, как затем внедрить этот сервис в другой сервис, откуда придет параметр. Вот пример кода:

// interface
pubic Interface IProvider 
{
    string GetParameter();
}

// implementation
public class Provider : IProvider
{
    private readonly int? _parameterId;
    public Provider(int? parameterId){
        _parameterId = parameterId;
    }
    public string GetParameter(){
         // go get my parameter from wherever using int that was passed to constructor
    }
}

Теперь в моем контроллере API я могу добавить этот сервис, чтобы получить параметр:

public class ParameterController : ApiController
{
    private readonly IProvider _provider;
    public ParameterController(IProvider provider){
         _provider = provider;
    }
    [HttpGet]
    public string GetParameterNoInput(){
         _provider.GetParameter(null);
    }
    [HttpGet]
    public string GetParameter(int input){
        // my provider wants this input but not as a passed parameter
        // I don't know how to do this
    }
 }

И, конечно, регистрация

builder.RegisterType<Provider>().As<IProvider>().InstancePerRequest()
   .WithParameter(new TypedParameter(typeof(Guid?), "parameterId"));

FWIW, я знаю, что это не лучший выбор дизайна, но это то, что мне диктуют. Какова схема решения этой проблемы в autofa c? Для пояснения, часть, которая диктуется, заключается в том, что IProvider имеет вставляемый в него обнуляемый параметр параметра INTII вместо того, чтобы предоставлять методы, которые принимают значение типа int

Должен ли я делать что-то подобное в моем контроллере:

Func<int?>, IProvider _newProvider;
public ParameterController(Func<int?, IProvider> provider){
    _newProvider = provider;
}

// and then in my api i can do
[HttpGet]
public string GetParameter(int input){
    var provider = _newProvider(input);
    provider.GetParameter();
}

1 Ответ

1 голос
/ 05 марта 2020

Autofa c позволяет передавать параметр при регистрации вашего сервиса. В вашем случае это выглядело бы примерно так

builder.Register(c => new Provider(someInt)).As<IProvider>().InstancePerRequest();

Предполагая, что все экземпляры провайдера должны передавать один и тот же параметр.

Дополнительную информацию и пару других способов настройки можно найти в автофо c документы

...