我最近开始阅读有关依赖注入的内容,它让我重新思考了我的一些设计.
我遇到的问题是:让我说我有两个班:汽车和乘客; 对于这两个类,我有一些数据映射器来处理数据库:CarDataMapper和PassengerDataMapper
我希望能够在代码中执行以下操作:
$car = CarDataMapper->getCarById(23); // returns the car object
foreach($car->getPassengers() as $passenger){ // returns all passengers of that car
$passenger->doSomething();
}
Run Code Online (Sandbox Code Playgroud)
在我对DI有所了解之前,我会像这样构建我的类:
class Car {
private $_id;
private $_passengers = null;
public function getPassengers(){
if($this->_passengers === null){
$passengerDataMapper = new PassengerDataMapper;
$passengers = $passengerDataMapper->getPassengersByCarId($this->getId());
$this->setPassengers($passengers);
}
return $this->_passengers;
}
}
Run Code Online (Sandbox Code Playgroud)
我也会在Passenger-> getCar()方法中使用类似的代码来获取乘客所在的汽车.
我现在明白,这会在Car和Passenger对象以及数据映射器对象之间创建依赖关系(好吧,我之前也理解它,但我不知道这是"错误的").
虽然想到了解决这两个选项的解决方案,但我真的不喜欢它们中的任何一个:
1:做这样的事情:
$car = $carDataMapper->getCarById(23);
$passengers = $passengerDataMapper->getPassengersByCarId($car->getId());
$car->setPassengers($passengers);
foreach($car->getPassengers() as $passenger){
$passenger->doSomething();
}
Run Code Online (Sandbox Code Playgroud)
但是如果乘客有需要注入的对象怎么办呢?如果嵌套进入十到二十级呢?我最终会在我的应用程序开始时实例化几乎所有对象,而这会反过来查询整个数据库.处理.如果我必须将乘客送到另一个必须对乘客拥有的物体做某事的物体,我也不想立即实例化这些物体.
2:将数据映射器注入汽车和乘客对象,并具有以下内容:
class Car {
private $_id;
private $_passengers = …Run Code Online (Sandbox Code Playgroud) 要在我们的应用程序中实现数据访问代码,我们需要一些框架来包装jdbc(由于可伸缩性,ORM不是我们的选择).
我以前使用的最酷的框架是Spring-Jdbc.但是,我公司的政策是避免外部依赖,尤其是Spring,J2EE等.所以我们正在考虑编写自己的方便的jdbc框架,功能类似于Spring-jdbc:行映射,错误处理,java5的支持功能,但没有交易支持.
有没有人有编写这样的jdbc包装框架的经验?如果有人有使用其他jdbc包装框架的经验,请分享您的经验.
提前致谢.
我的问题涉及到c#以及如何访问静态成员...我真的不知道如何解释它(对于一个问题有什么不好的不是吗?)我将给你一些示例代码:
Class test<T>{
int method1(Obj Parameter1){
//in here I want to do something which I would explain as
T.TryParse(Parameter1);
//my problem is that it does not work ... I get an error.
//just to explain: if I declare test<int> (with type Integer)
//I want my sample code to call int.TryParse(). If it were String
//it should have been String.TryParse()
}
}
Run Code Online (Sandbox Code Playgroud)
所以,谢谢你们的答案(顺便问一下:如果没有出现错误,我将如何解决这个问题).这对您来说可能是一个非常简单的问题!
谢谢,尼克拉斯
编辑:谢谢大家的回答!
虽然我认为try-catch短语是最优雅的,但我从vb的经验中知道它真的可能是一个无赖.我曾经用过一次,花了大约30分钟来运行一个程序,后来只花了2分钟来计算,因为我避免了尝试 - 捕获.
这就是我选择swich语句作为最佳答案的原因.它使代码更复杂,但另一方面,我认为它相对快速且相对容易阅读.(虽然我仍然认为应该有一种更优雅的方式......也许用我学习的下一种语言:P)
虽然如果你有其他建议,我还在等待(并愿意参加)
我想知道通过WCF服务公开什么对象有什么意义 - 我应该将WCF序列化规范添加到我的业务实体,还是应该实现一个转换器,将我的业务实体映射到我希望通过我的WCF公开的DataContracts服务?
现在我有不同级别的实体:DataAccess,Business和Contract.我有适当的转换器,可以将实体从DataAccess映射到Business,从Business映射到Contract,反之亦然.实施和维护这些是耗时且相当繁琐的.与此相关的最佳做法是什么?
如果我使用的是OR/M,例如NHibernate或Entity Framework,我应该直接从ORM公开实体,还是应该像现在一样抽象它们?
提前致谢.
我知道有哪些优点,当我使用更复杂的系统时,我会使用虚假数据.
如果我正在开发一些简单的东西,我可以轻松地在真实数据库中设置我的环境,并且访问的数据非常小,访问时间不是一个因素,我只运行一些测试.
创建虚假数据是否仍然很重要,或者我是否可以忘记额外的编码并跳过真正的东西?
当我说真正的数据库时,我不是指生产数据库,我的意思是测试数据库,而是使用真实的DBMS和与真实数据库相同的模式.
在生产服务器上,有时随机连接失败到ORacle数据库.我得到了很多
Oracle.DataAccess.Client.OracleException 池化连接请求超时 在Oracle.DataAccess.Client.OracleException.HandleErrorHelper(Int32 errCode,OracleConnection conn,IntPtr opsErrCtx,OpoSqlValCtx*pOpoSqlValCtx,Object src,String procedure,Boolean bCheck, Int32 isRecoverable)位于路径中ws.DataConnection()的Oracle.DataAccess.Client.OracleConnection.Open()上的Oracle.DataAccess.Client.OracleException.HandleError(Int32 errCode,OracleConnection conn,IntPtr opsErrCtx,Object src).
我搜索了一些解决方案,但没有运气.奇怪的是,Exception没有像Ora-123那样的标识符......我使用了OracleDataAccess客户端.有时这个问题是5-10秒,有时我必须重新启动IIS(6.1,Windows Server 2008 R2)才能解决问题.令人沮丧...我不能设置pooling = false因为我们有一个庞大的网站.有解决方案吗
显然,关注点分离是我们代码中的一个理想特征,大多数人采取的第一个明显步骤是将数据访问与表示分开.在我的情况下,LINQ To SQL正在数据访问对象中用于数据访问.
我的问题是,实体对象的使用应该停在哪里?为了澄清,我可以将实体对象传递到域层,但我觉得实体对象不仅仅是一个数据对象 - 就像将DAL的一部分传递到下一层一样.
假设我有一个UserDAL类,它应该在调用方法GetByID()时将实体User对象暴露给域,还是应该纯粹用于存储数据的纯数据对象?(在这种情况下似乎浪费重复)
你们在同样的情况下做了什么?有替代方法吗?
希望这不是太模糊.
非常感谢,
马丁.
在阅读了Evan和Nilsson的书之后,我仍然不确定如何在域驱动的项目中管理数据访问.如果CRUD方法是存储库的一部分,即OrderRepository.GetOrdersByCustomer(客户),或者它们应该是实体的一部分:Customer.GetOrders().后一种方法似乎更多OO,但它将在多个对象中为单个实体类型分发数据访问,即Customer.GetOrders(),Invoice.GetOrders(),ShipmentBatch.GetOrders()等.那么插入和更新呢?
传统主义者认为,与使用NHibernate等对象关系映射(ORM)框架相比,存储过程提供了更好的安全性.
为了反驳这个论点,NHibernate可以使用哪些方法来确保适当的安全性(例如,防止sql注入等)?
(每个答案只提供一种方法)
我想知道是否应该创建适用于对象级别的扩展方法,或者它们是否应该位于类层次结构中的较低点.我的意思是:
public static string SafeToString(this Object o) {
if (o == null || o is System.DBNull)
return "";
else {
if (o is string)
return (string)o;
else
return "";
}
}
public static int SafeToInt(this Object o) {
if (o == null || o is System.DBNull)
return 0;
else {
if (o.IsNumeric())
return Convert.ToInt32(o);
else
return 0;
}
}
//same for double.. etc
Run Code Online (Sandbox Code Playgroud)
我编写了这些方法,因为我必须处理很多数据库数据(来自OleDbDataReader),这些数据可以为null(不应该),因为底层数据库很可能非常宽松,列可能为null.为了让我的生活更轻松,我想出了那些扩展方法.
我想知道的是这是好风格,可接受的风格还是坏风格.我有点担心它,因为它有点"污染"对象类.
提前谢谢你和最好的问候:)
基督教
PS我没有故意将其标记为"主观".
data-access ×10
c# ×2
.net ×1
connection ×1
database ×1
dns ×1
generics ×1
java ×1
jdbc ×1
lazy-loading ×1
linq ×1
linq-to-sql ×1
methods ×1
nhibernate ×1
oracle ×1
orm ×1
php ×1
security ×1
spring-jdbc ×1
static ×1
tdd ×1
wcf ×1