我想将数据层与业务逻辑和业务逻辑从GUI分离.潜入网络我偶然发现了一些资源,但仍无法让我清醒.有些人谈论的模式,其他人指出各种框架.我的要求是:
我需要的是:
delphi orm user-interface business-logic-layer business-objects
我有一个使用三层架构的ASP.net(C#)项目.我开始在我的DAL中使用Entity Framework,问题是Entity Framework生成的类在业务逻辑层中可以使用的程度是多少?
最好直接使用它们,还是应该创建自己的业务对象并从Entity Framework(db-> O/RM-> BOs)映射到它们?
我很难绕过业务对象或更具体地说是业务对象集合.
这是我正在尝试做的一个简单示例.
如果我有一个事件对象,则此对象可以包含许多人,并且每个Person对象都可以有多个注释.没有Person对象,Notes不能存在,如果没有Incident对象,Person对象就不能存在.
如果我有公共列表<Note> notes = new List <Note>(),则事件中的Person可以使用ADD和REMOVE等方法.我假设如果我要在Notes集合上调用这些方法,它将只是从列表中删除它,但不执行任何代码来实际添加/更新/删除数据源中的员工.这让我相信我不应该使用List而是其他什么?
这也引出了另一个问题.实际数据库CRUD操作应驻留在何处.Note对象是否应该有自己的CRUD,或者Person对象应该对它负责,因为它没有它就不存在?
我有点迷失方向,我想让这部分正确,因为它将成为该计划其余部分的模板.
从标题来看,我认为这是一个直截了当的问题,但是在研究"商业对象世界"时,我似乎无法理解任何商业对象应该是什么.我应该遵循哪些最佳实践,甚至是任何设计模式?
我找到了一本书"专家C#Business Objects",这是我最好的起点,以便更好地理解?
根据商业模式或业务对象,我指的是像"用户"这样的普通旧对象,其所有属性名称,地址,......; 除了所有用户属性之外,假设每个用户都有一个"AppointmentBook"对象,每本书都有一组"TimeSlot"对象等.商业模型中有对象,它们之间有引用,至少我是如何对业务进行编码的Java中的模型.问题出在这里:
要用Java初始化我的业务对象,我会的
PHP的 Share-Nothing-Architecture让我对正确的OO编程感到困惑:如果我使用相同的逻辑,我将不得不从DB中获取所有对象,因为每个请求(我知道我仍然可以缓存,但是你没有缓存所有数据库,这不是关于缓存的问题,而是关于PHP及其架构中的编程方式).
所以,假设对于一个HTTP请求,我只需要用户属性,而不需要访问他的约会簿.从User获取的所有对象中获取DB的所有数据将是一个小问题,因为我只需要他的属性.这意味着我将使用很多NULL值从我的模型初始化PHP对象(因为我将不加载的User中包含的对象为NULL),这可能导致错误.
我想知道专业的PHP开发人员通常如何使用他们的业务对象?(我来自Java)
更新:说在Java中的应用程序初始化期间我将整个数据库加载到内存中是一种愚蠢的做法.我的意思是,如果我需要获取特定用户,我可以加载其所有数据,并且可以通过所有请求访问.
背景:
我目前正在为企业CMS数据库(Business Objects)开发Java前端.目前,我正在构建一个功能,允许用户构建自定义数据库查询.我已经实施了一些措施来确保用户只能使用已批准用户访问的可用列和运算符的子集进行选择(例如,可以选择SI_EMAIL_ADDRESS,而不能使用更强大的字段,如SI_CUID).到目前为止,事情一直在流动,但现在是时候保护此功能免受潜在的SQL注入攻击.
问题:
我正在寻找一种方法来逃避用户输入字符串.我已经看过PerparedStatement,但是我被迫使用第三方API来访问数据库.这些API对我来说是不可变的,直接的数据库访问是不可能的.各个方法接受表示要运行的查询的字符串,从而使PreparedStatement无效(据我所知,必须针对直接数据库连接运行).
我考虑过使用String.replace(),但如果可能的话我不想重新发明轮子.另外,我与开发PerparedStatement的安全专家相去甚远.
我还查看了PerparedStatement的Java API参考,希望找到某种toString()方法.唉,我一直都找不到那种东西.
任何帮助是极大的赞赏.先感谢您.
参考文献:
打开文档时遇到问题。
reportEngines =
(ReportEngines) enterpriseSession.getService("ReportEngines");
ReportEngine wiRepEngine =
(ReportEngine) reportEngines.getService(
ReportEngines.ReportEngineType.WI_REPORT_ENGINE);
/*
* Process Webi Documents from a folder
* */
for (Object object : infoObjects) {
IInfoObject infoObject = (IInfoObject) object;
String path = getInfoObjectPath(infoObject);
if (path.startsWith("/")) {
String doc = infoObject.getTitle();
System.out.println("Title :" + doc + "\n ID " + infoObject.getID() );
System.out.println(path + "/" + doc);
System.out.println(infoObject.toString());
DocumentInstance widoc = wiRepEngine.openDocument(infoObject.getID());
}
}
Run Code Online (Sandbox Code Playgroud)
调用 openDocument() 时抛出以下异常
com.businessobjects.rebean.wi.CommunicationException: Cannot initialize Report Engine server. (Error: RWI 00226)
at com.businessobjects.rebean.wi.occa.OccaConnection.doConnect(Unknown …Run Code Online (Sandbox Code Playgroud) 我正在使用Business Objects,它运行在Oracle SQL数据库之上.我没有访问PL或任何类型的SQL命令行,我没有对数据库的写访问权限.我只能将查询作为单个命令运行,需要输出一组已定义的列.
我可以从用户提示中获取数据,这些提示出现在SQL中:
@variable('Prompt1')
Run Code Online (Sandbox Code Playgroud)
例如我可以说:
SELECT
A.SomeDate
FROM
A
WHERE
A.SomeDate BETWEEN @variable('Start') AND @variable('End Date')
Run Code Online (Sandbox Code Playgroud)
这很容易.它运行; 请求用户输入一些日期; 然后返回它们之间的所有匹配(包括).
但问题是,用户将使用Business Objects的"Infoview"系统来运行查询,并且提示系统会显示日期选择器 - 默认情况下包括日期的时间部分("01/01/2016 12 :00:00 AM").
如果用户没有删除时间部分,如果SomeDate值超出所选时间,则可能导致错过记录.例如,如果我想获取今天的所有记录,那么我在技术上想要在00:00:00(午夜)和23:59:59之间的所有内容.
我真正希望能够在查询变量周围使用TRUNC,如下所示:
WHERE
A.SomeDate BETWEEN TRUNC(@variable('Start')) AND TRUNC(@variable('End Date'))
Run Code Online (Sandbox Code Playgroud)
...但是这会导致编译错误:"数据类型不一致:预期DATE得到NUMBER".我不知道为什么Oracle会在编译之前将提示视为数字数据类型.
有谁知道如何获取@variable值并将其转换为我能够截断为日期值的东西?
因此,我正试图找到解决这个问题的方法.我想到的一件事是,如果我可以使用提示变量并使用TO_DATE将其显式转换为日期
编辑:有人向我指出,TRUNC将无效,因为"12:00:00 AM"已经是午夜.所以我觉得我误解了TRUNC.似乎它将它截断到午夜:而我认为它只是完全删除了日期的时间部分,这意味着匹配将在00:00:00和23:59:59之间的任何时间返回.
我真正想要的是:如果SomeDate有一个时间部分,例如,11:03那么当结束日期提示只指定当天时,我如何确保包括它?
在设计业务对象时,我尝试了几种不同的编写数据访问层的方法.有些人比其他人做得更好,但我一直觉得必须有一个"更好"的方式.
我真的只想看看人们在不同情况下处理DAL的不同方式以及他们对技术如何工作或不能正常工作的看法.
我有一个业务对象,它是子对象的组合。
我在Visual Studio 2008中使用数据绑定来绑定到Windows窗体上的控件。
但是我在窗体的InitializeComponent方法中收到上述错误。
可以说我有一个名为ParentObject的对象,其中包含一个通用列表ChildListObject。ParentObject还具有Child对象,该对象本身具有Child对象。(即ParentObject.ChildObject.ChildObject)
我设置了主要的绑定源:
BindingSource.Datasource = ParentObject
Run Code Online (Sandbox Code Playgroud)
我添加一个网格并设置它的绑定源:
GridBindingSource.Datasource = ParentObject
Run Code Online (Sandbox Code Playgroud)
并将DataMember设置为:
BindingSourceB.DataMember = "ChildListObject"
Run Code Online (Sandbox Code Playgroud)
现在,将网格的数据源设置为GridBindingSource:
Me.MyDataGridView.DataSource = Me.GridBindingSource
Run Code Online (Sandbox Code Playgroud)
还有其他绑定到ParentObject和ParentObject.ChildObject属性的控件。
我已经在一个隔离的项目中对此进行了测试,并且效果很好,所以我很难找出真正的错误是什么?曾经起作用的代码会突然停止工作。
我得到的错误是(如果我在上面的示例中使用对象的名称):
“在数据源上找不到DataMember属性ChildObject”
它在以下方面失败:
Me.MyDataGridView.DataSource = Me.GridBindingSource
Run Code Online (Sandbox Code Playgroud)
奇怪的是,如果我删除<System.Diagnostics.DebuggerStepThrough()>,然后当它失败时继续,就可以了???但是它在运行时仍然失败。
有没有人有任何想法可以指出我正确的方向?我通过谷歌搜索发现的最接近的信息可能与生成的设计器代码混乱的顺序有关。一直在工作的代码将突然停止工作。
这个问题似乎来了又去。如果在出现错误后我仍然继续,则程序会愉快地继续运行而不会出现问题。可能是VS中的错误。但是在运行时错误仍然存在。
是什么导致此问题?如何阻止它发生?
business-objects ×10
.net ×2
c# ×2
java ×2
sql ×2
architecture ×1
data-binding ×1
delphi ×1
infoview ×1
oop ×1
oracle ×1
orm ×1
php ×1
truncate ×1