Как получить доступ к определителю зависимостей в ASP.NET WebAPI во внешней библиотеке - PullRequest
0 голосов
/ 29 января 2019

Я разрабатываю пакет NuGet, который будет использоваться моим приложением.Из-за уже реализованной архитектуры проекта мне нужно предоставить способ создания экземпляров объектов с помощью внедрения зависимостей как для MVC, так и для веб-API вне области моего контроллера.В настоящее время у меня есть класс, который работает в проектах MVC, путем создания экземпляров объектов с помощью DependencyResolver

public abstract class MyBaseClass<T> where T : class
  {
    public static T Instance
    {
      get
      {
          return DependencyResolver.Current.GetService<T>();
      }
    }
  }

Однако при использовании этого же класса из проекта WebAPI DependencyResolver отсутствует, поэтому я не могу получитьлюбой объект.

Я пытался получить доступ к средству разрешения зависимостей через HttpContext, но безуспешно.У вас есть какой-нибудь способ, которым я могу получить к нему доступ через пакет NuGet?

Спасибо!

1 Ответ

0 голосов
/ 29 января 2019

Если это возможно, я бы рекомендовал избегать шаблона локатора службы и вместо этого вводить зависимость через конструктор:

public abstract class MyBaseClass<T> where T : class
{
    public MyBaseClass(T instance)
    {
        Instance = instance;
    }

    public T Instance { get; }
}

Это позволит вам использовать ваш пакет через любую "основную" точку входа (например MVC или WebAPI), который вы выбираете.В этот момент потребитель должен будет обеспечить необходимую стратегию разрешения зависимостей.


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

public class MyWebApiClass : MyBaseClass<MyDependency>
{
    public MyWebApiClass(MyDependency resolvedDependency) : base(resolvedDependency) { }
}

public class MyDependency
{
    public string Foo { get; set; }

    public MyDependency()
    {
        Foo = "Bar";
    }
}

Тогда служба-потребитель также регистрирует эти зависимости:

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
    services.AddTransient<MyDependency>();
    services.AddTransient<MyWebApiClass>();
}

... и внедряет при необходимости, что позволяет инфраструктуре разрешать зависимости (IoC на работе):

[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
    private readonly MyWebApiClass _myWebApiClass;

    public ValuesController(MyWebApiClass myWebApiClass)
    {
        _myWebApiClass = myWebApiClass;
    }

    // GET api/values
    [HttpGet]
    public ActionResult<IEnumerable<string>> Get()
    {
        return new string[] { _myWebApiClass.Instance.Foo };
    }
}

Посылая вызов вышеупомянутой конечной точке GET, мы видим, что наш экземпляр разрешается в MyBaseClass:

enter image description here

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