首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何透明处理多个存储后端

如何透明处理多个存储后端
EN

Stack Overflow用户
提问于 2011-03-09 20:24:08
回答 1查看 108关注 0票数 1

我现在正在使用一个应用程序,它使用第三方API来处理一些与电子邮件相关的批处理任务,为了让它工作,我们需要在这个服务中存储一些信息。不幸的是,这些信息(名/姓,电子邮件地址)也是我们希望在应用程序中使用的信息。我的正常倾向是选择一个规范的数据源并坚持使用它,但是每次我想要查找这些字段时往返到web服务并不是一个真正可行的选择(我们经常使用其中的一些字段),并且该服务的API需要将记录存储在那里,因此可悲的是复制是必要的。

但是,我没有兴趣在我们的业务类中的每个方法中填充代码,以便在数据可能被更新的任何时候将数据同步到web服务,而且我也不认为我的实体应该知道服务在属性设置器中更新自身(或者任何其他正在更新“真相”的东西)。

我们使用NHibernate来满足我们所有的DAL需求,在我看来,这种数据复制实际上是一个持久性问题-所以我使用一个EventListener (包括PostInsert和PostUpdate)创建了一个PoC实现,它检查实体是否为X类型,以及字段Y..Z中的任何字段是否已更改,是否使用新状态更新web服务。

我觉得这在确保我们的数据是规范的来源和确保它被透明地复制之间取得了很好的平衡,并最大限度地减少了改变失败并使我们陷入不匹配的情况的机会(如果例如,不是世界末日。服务是无法访问的,我们只是稍后进行手动批量更新,但为了每个人在一般情况下的理智,目标是我们永远不需要考虑它),但我和我的同事们对这种前进的方式仍然有一定程度的不适。

这是一个可怕的想法,将邀请猛禽在不合时宜的时候进入我的数据库?用EventListener做这件事是完全合理的吗?对于一个不太理想的情况,我们可以凑合着永远向前看,这是一个可行的解决方案吗?如果我们继续沿着这条路走下去,在事件管道中有什么我应该警惕的陷阱吗?

EN

回答 1

Stack Overflow用户

发布于 2011-03-09 21:29:01

在不可靠的数据存储(在您的案例中是Web服务)的情况下,我会引入事务(操作)的概念,并将它们存储在本地数据库中,然后定期从数据库中提取它们并针对Web服务(其他数据存储)执行。

如下所示:

代码语言:javascript
复制
    public class OperationContainer
    {
    public Operation Operation; //what ever operations you need CRUD, or some specific
    public object Data; //your entity, business object or whatever
    }

    public class MyMailService
    {
    public SendMail (MailBusinessObject data)
    {
    DataAcceessLair<MailBusinessObject>.Persist(data);
    OperationContainer operation = new OperationContainer(){Operation=insert, Data=data};
    DataAcceessLair<OperationContainer>.Persist(operation);
    }
    }

    public class Updater
    {
    Timer EverySec;
    public void OnEverySec()
    {
    var data = DataAcceessLair<OperationContainer>.GetFirstIn(); //FIFO
    var webServiceData = WebServiceData.Converr(data); // do the logic to prepare data for WebService
try
{
    new WebService().DoSomething(data);
DataAcceessLair<OperationContainer>.Remove(data);
}
    }
    }

这实际上非常接近智能客户端的概念-从技术上讲不是逻辑上的。看看书:使用C#的.NET领域驱动设计:问题-设计-解决方案,第10章。或者看看书中的源代码,它与您的情况非常接近:http://dddpds.codeplex.com/

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5245725

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档