当前位置: 首页 > 编程语言 > C#

使服务层可以访问对象,而不在MVC4应用程序中作为参数传递分享

时间:2023-04-10 11:50:03 C#

C#学习教程:在MVC4应用程序中使对象可访问服务层而不将它们作为参数传递数据库。我有一个租户表,我的每个模型都有一个TenantIdid。每个租户都有一个字符串“Url”,用于标识用于访问该租户数据的完整URL。我可以通过以下(粗略近似)从我的BaseController访问它:HttpRequestrequest=HttpContext.Current.Request;urirequestUrl=request.Url;_tenant=_tenantService.GetTenantByUrl(requestUrl);现在,我需要将租户传递给服务层来执行业务逻辑。我可以做到这一点的一种方法是查看所有服务的每个方法(~200种方法)并添加一个Tenant参数。我必须触及每个服务层调用和每个服务层方法。这行得通,但是很乏味并且会使代码混乱。例如,我以前的方法之一:InternalDeleteUser(数据库,用户);}}之后(如果我通过租户):publicvoidDeleteUserById(Tenanttenant,intuserId){using(vardb=CreateContext()){varuser=tenant.Users.FirstOrDefault(u=>u.UserId.Equals(userId));内部删除用户(数据库,用户);我想要实现的目标(通过从我的BaseController设置租户,一层):.UserId.Equals(userId));内部删除用户(数据库,用户);有什么方法可以使用我的BaseService(所有其他服务都继承自该服务)或其他一些模式来从Controller定义租户并让服务方法获取它而不将其作为参数传递给每个服务方法?这样我只需要触摸基本控制器(或者甚至可能是global.asax),不需要其他任何东西。简而言之:如何通过从MVC控制器定义一个对象而不将其直接传递给服务来访问所有服务?我认为您所说的有关基本服务的内容(请参阅LayerSupertype)是有道理的。这个基类将依赖于在同一服务层中定义的接口(例如IUserSession、IContext或其他),并且该接口将具有将返回您的租户的方法或属性。此接口的实现将驻留在您的Web应用程序中,它将执行您描述的操作,从HttpContext获取数据。如果您有后台进程、控制台应用程序或任何不在Web上下文中运行的东西,您将有一个不同的实现,它将根据您需要的任何其他条件创建租户。总而言之,您的服务层中有:abstractclassBaseService{protectedIContextContext{get;私有集;}publicBaseService(IContextcontext){Context=context;}}publicinterfaceIContext{TenantGetTenant();}然后在您的网络层中,您将拥有:publicIWebContext:IContext{publicTenantGetTenant(){//您的代码返回基于url创建租户。}}希望这可以帮助。我遇到了同样的“问题”,因为我正在构建一个多租户应用程序。但是,我很简单地解决了这个问题,IMO:每个存储库/服务都定义了一个TenantId属性,在使用该服务时必须设置该属性。TenantId是一个值对象,如果为null则抛出该对象。现在,重点是任何存储库/服务都可以在请求之外使用,例如在后台线程或应用程序中。我使用的是消息驱动的方法,因此任何必需的信息(如租户ID)都是消息的一部分,因此可供服务的消费者(消息处理程序)使用。另一个好处是可测试性。我建议不要将您的服务耦合到特定于请求的对象,例如HttpContext、Session或Cache。以上就是C#学习教程:让服务层在MVC4应用程序中无需将对象作为参数传递即可访问对象。网络收藏不代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: