kgh*_*ous 5 c# dependency-injection multi-tenant asp.net-core
我正在努力遵循 IoC 模式并使用 Microsoft DI 框架,但我遇到了困难,无法确定这是我的心态、我的方法还是我只是做错了。
我有一个多租户应用程序,它利用实用程序类来处理隔离并根据租户的独特配置访问租户的数据。租户在身份验证期间被识别,但租户数据必须可根据请求访问和处理。该Utility类在ConfigureServices下注册,并且Startup.cs
构造函数需要两个参数 - aTenantDbContext
和 a Tenant
。
public class TenantUtility{
public TenantUtility(TenantDbContext context, Tenant tenant){/*...*/}
}
Run Code Online (Sandbox Code Playgroud)
意识到我可能正在突破 DI 框架的限制,我尝试在Startup.cs
. 我尝试了两种访问租户 ID 来构建对象的方法Tenant
:一种是使用用户声明,第二种是路由参数。
services.AddTransient<TenantUtility>((svc)=> {
var tenantContext = svc.GetService<TenantDbContext>();
var accessor = svc.GetService<IHttpContextAccessor>();
var httpContext = accessor.HttpContext;
//httpContext is NULL...
//How do I get access to the tenant?
Common.Tenant t = new Common.Tenant();
//Set Tenant Identifier in t (once I get it)
return new StudentDataManager(tenantContext, t);
});
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,当我在 Startup.cs 中设置 ImplementFactory 时,我无权访问用户,也无权访问 RouteData(或不知道如何获取它)——我什至尝试使用IHttpContextAccessor
,但该HttpContext
属性为空。
我是否错误地接近了模式?在将实用程序类传递到控制器之前,我是否应该能够使用 DI 将这种级别的详细信息注入到实用程序中?
您不应该将非 DI 托管类型传递到您希望容器为您提供的服务(在本例中为您的 Tenant 参数)。只请求容器可以提供的服务。如果您需要租户,也许可以注入另一种服务(例如 ITenantAccessor)并且能够获得该服务。
我怀疑您的实现可以在中间件(如果不使用 MVC)或作为过滤器(如果使用 MVC)中完成。无论哪种情况,您都可以使用过滤器或中间件类中的 DI 来注入租户服务。在类的调用方法中,您将可以访问当前上下文和请求,并且应该能够执行您需要执行的操作。请记住,它ConfigureServices
在应用程序启动之前运行,因此没有上下文,也没有发出任何请求。
如果您想查看过滤器的一些示例,尤其是如何对过滤器进行 DI 操作,请查看: https: //github.com/ardalis/GettingStartedWithFilters
和
http://ardalis.com/real-world-aspnet-core-mvc-filters
如果您想在中间件中执行此操作,那么这些可能会有所帮助: https ://github.com/ardalis/NotFoundMiddlewareSample
和
http://ardalis.com/using-custom-middleware-to-record-and-fix-404s-in-aspnet-core-apps
归档时间: |
|
查看次数: |
1785 次 |
最近记录: |