Я пытаюсь создать некоторое промежуточное ПО 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;
}
}
Есть идеи?