【发布时间】:2019-06-07 00:05:59
【问题描述】:
一句话,我最终需要知道的是如何在中间层函数之间共享对象而不需要应用层传递数据模型对象。
我正在为我工作的公司在当前环境中构建一个中间层。目前,我们主要使用 .NET 进行编程,并围绕我们所有的各种数据库系统(包括 Oracle、OpenLDAP、MSSQL 等)构建了自定义数据模型。
我在尝试从应用层拉取我们的模型并将其移动到一系列中间层库时遇到了问题。我遇到的主要问题是应用程序层能够在整个进程期间挂起缓存的对象并根据缓存的数据进行更新,但中间层操作没有。
我试图将模型对象尽可能地排除在应用程序之外,这样当我们对底层数据库结构进行更改时,我们可以轻松地编辑和重新部署中间层,并且多个应用程序不需要被重建。我将简要介绍一下伪代码的问题所在,因为这是我们开发人员最了解的内容:)
main
{
MidTierServices.UpdateCustomerName("testaccount", "John", "Smith");
// since the data takes up to 4 seconds to be replicated from
// write server to read server, the function below is going to
// grab old data that does not contain the first name and last
// name update.... John Smith will be overwritten w/ previous
// data
MidTierServices.UpdateCustomerPassword("testaccount", "jfjfjkeijfej");
}
MidTierServices
{
void UpdateCustomerName(string username, string first, string last)
{
Customer custObj = DataRepository.GetCustomer(username);
/*******************
validation checks and business logic go here...
*******************/
custObj.FirstName = first;
custObj.LastName = last;
DataRepository.Update(custObj);
}
void UpdateCustomerPassword(string username, string password)
{
// does not contain first and last updates
Customer custObj = DataRepository.GetCustomer(username);
/*******************
validation checks and business logic go here...
*******************/
custObj.Password = password;
// overwrites changes made by other functions since data is stale
DataRepository.Update(custObj);
}
}
另一方面,我考虑过的选项是构建一个本地缓存层,这需要大量时间,而且是一个很难向管理层出售的概念。使用内置缓存支持的不同建模层,例如 nHibernate:这也很难卖给管理层,因为这个选项也需要很长时间才能拆开我们的整个自定义模型并用第三方解决方案替换它.此外,支持我们大量数据库的供应商并不多。例如,.NET 有 LINQ to ActiveDirectory,但没有 LINQ to OpenLDAP。
不管怎样,很抱歉这篇小说,但这更像是一个企业架构类型的问题,而不是一个简单的代码问题,例如“如何在 .NET 中获取当前日期和时间?”
编辑
抱歉,我忘记在我的原始帖子中添加一些非常重要的信息。我感觉很糟糕,因为 Cheeso 遇到了很多麻烦来写一个非常深入的回复,如果没有更多的问题(我愚蠢地没有包括),这将解决我的问题。
我面临当前问题的主要原因是数据复制。第一个函数写入一个服务器,然后下一个函数从另一个尚未接收到复制数据的服务器读取。所以本质上,我的代码比数据复制过程更快。
我可以通过始终读取和写入同一个 LDAP 服务器来解决此问题,但我的管理员可能会因此而谋杀我。专门设置了一个仅用于写入的服务器,然后在负载均衡器后面设置了 4 个其他服务器,这些服务器仅用于读取。我绝不是 LDAP 管理员,所以我不知道这是否是标准程序。
【问题讨论】:
标签: c# architecture caching soa