試圖找出一種方法來建立會話管理DryIoC(V2.0.0-rc4build353),MS OWIN(V3.0.1,WebAPI2(客戶端v5.2.3)上VS2015, .NET 4.5。DryIoC /網絡API 2/OWIN和會話管理
我與包裝REST API一個相當複雜的遺留應用程序。嚴格的API服務器,沒有UI/MVC。據我所知,這是不可能的,我去完全無狀態,因爲我要保持一個「模型」開放的服務器端,用戶必須驗證到模型中,因此會話的概念出現了,我想盡可能使用DI。 ISession提供呃工廠。雖然Ninject有其專業(模塊,一個),但我不喜歡它的複雜性。我無法弄清楚如何從工廠訪問請求對象。經過一番研究,我決定切換到DryIoC。
在下面DryIoC的代碼示例創建一個單獨的會話(見下文再利用),並將其注入到我的RootController。如果我在瞬態範圍中註冊會話,我顯然會根據請求獲得一個會話。我設想一個叫「api/login」的調用會生成一個令牌。客戶端將緩存它並將其隨後的調用提交到頭中(以便啓用API版本)。
如何管理作用域掙扎。
編輯:什麼,我想我需要澄清:我不知道如何實現一個工廠DryIoC將實例化一個控制器,在這裏我想查找會話標識和創建/查找相關ISession實例之前調用。 DryIoC然後將使用它來注入控制器。
編輯:我試圖隱藏所有會話管理樣板,並將所有控制器,已初始化會話注入。如果此請求沒有會話,則單獨的路由會返回錯誤。另外需要注意的是,客戶端必須明確獲取令牌。沒有全球「當前」令牌或會話的概念。
using System;
using System.Web.Http;
using Microsoft.Owin.Hosting;
using Microsoft.Owin.Diagnostics;
using Owin;
using DryIoc;
using DryIoc.WebApi;
namespace di_test
{
class Program
{
static void Main(string[] args)
{
var url = "http://localhost:8065";
using (WebApp.Start<Startup>(url))
{
Console.WriteLine("Owin host started, any key to exit");
Console.ReadKey();
}
}
}
class Startup
{
public void Configuration(IAppBuilder app_)
{
var config = new HttpConfiguration();
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "default",
routeTemplate: "{controller}"
);
var di = new DryIoc.Container();
di.Register<ISession, Session>(Reuse.Singleton);
di.WithWebApi(config);
app_.UseWebApi(config);
app_.UseErrorPage(ErrorPageOptions.ShowAll);
}
}
public interface ISession
{
string Token { get; }
}
public class Session : ISession
{
string m_token = null;
public Session()
{
Console.WriteLine("Session()");
}
public string Token => m_token ?? (m_token = Guid.NewGuid().ToString());
}
[RoutePrefix("api")]
public class RootController : ApiController
{
readonly ISession m_session;
public RootController(ISession session_)
{
m_session = session_;
}
[Route()]
public IHttpActionResult GetApiRoot()
{
return Json(
new
{
type = "root",
token = m_session.Token
});
}
}
}
我不太明白:你想有一個會議_per什麼_? –
@FyodorSoikin Session「something」:)我不確定如何實現DryIoC在實例化控制器之前調用的工廠,在那裏查找會話標記和創建/查找關聯的ISession實例。 DryIoC然後將使用它來注入控制器。 –
我認爲你已經完成了這個複雜化。如果遺留系統具有調用API的能力,那麼它可以調用令牌的API。令牌存儲在客戶端,並在調用資源API時傳遞到頭中。查看JWT和oAuth。 API不應該有會話的概念。 –