Промежуточное ПО OWIN и внедрение зависимостей по запросу с Unity в Asp.NET WebApi - PullRequest
0 голосов
/ 02 мая 2018

Я пытаюсь создать некоторое промежуточное ПО OWIN, которое разрешается Unity для каждого запроса в Asp.NET WebApi. (Не DotNetCore!)

Задача № 1: Я не могу понять, как передать next конструктору реализации OwinMiddleware. Этот код не скомпилируется, так как next равен Func<Task>, а конструктор ожидает тип OwinMiddleware.

public class CustomMiddleware : OwinMiddleware
{
    public CustomMiddleware(OwinMiddleware next) : base(next)
    {
    }

    public override async Task Invoke(IOwinContext context)
    {
        await Next.Invoke(context);
    }
}

app.Use(async (context, next) =>
{
    var middleware = new CustomMiddleware(next);
    await middleware.Invoke(context);
});

Мне удалось обойти это, не реализовав OwinMiddleware, однако это не так. Неужели есть способ заставить эту работу работать правильно?

Задача № 2: Как упоминалось ранее, я обошел проблему реализации OwinMiddleware. Теперь я хочу внедрить объект в CustomMiddleware и что тот же объект с областью для запроса должен быть разрешен на TestController дальше по конвейеру запроса, однако я вижу разные экземпляры объекта разрешены в CustomMiddleware и TestController для одного и того же запроса.

public class InjectedObject
{
    public string Instance = Guid.NewGuid().ToString();
}

public class CustomMiddleware
{
    private readonly InjectedObject _obj;

    public CustomMiddleware(InjectedObject obj)
    {
        _obj = obj;
    }

    public async Task Invoke(IOwinContext context, Func<Task> next)
    {
        //Do stuff with my object
        await next();
    }
}

А в методе настройки приложения:

container.RegisterType<CustomMiddleware>(new HierarchicalLifetimeManager());
container.RegisterType<InjectedObject>(new HierarchicalLifetimeManager());

app.Use(async (context, next) =>
{
    var middleware = container.Resolve<CustomMiddleware>();
    await middleware.Invoke(context, next);
});

И когда контроллер вызывается, InjectedObject отличается от того, который был введен в CustomMiddleware.

public class TestController : ApiController
{
    private readonly InjectedObject _obj;

    public TestController(InjectedObject obj)
    {
        _obj = obj;
    }
}

Есть идеи?

...