标签: data-access-layer

在django中分离业务逻辑和数据访问

我正在Django中编写一个项目,我发现80%的代码都在文件中models.py.这段代码令人困惑,经过一段时间后,我不再明白究竟发生了什么.

这是困扰我的:

  1. 我发现我的模型级别(它应该只负责处理数据库中的数据)也发送电子邮件,在API上运行到其他服务等等,这让我觉得很难看.
  2. 此外,我发现在业务逻辑中放置业务逻辑是不可接受的,因为这样很难控制.例如,在我的应用程序中,至少有三种创建新实例的方法User,但从技术上讲,它应该统一创建它们.
  3. 我并不总是注意到我的模型的方法和属性何时变得不确定,何时会产生副作用.

这是一个简单的例子.起初,User模型是这样的:

class User(db.Models):

    def get_present_name(self):
        return self.name or 'Anonymous'

    def activate(self):
        self.status = 'activated'
        self.save()
Run Code Online (Sandbox Code Playgroud)

随着时间的推移,它变成了这样:

class User(db.Models):

    def get_present_name(self): 
        # property became non-deterministic in terms of database
        # data is taken from another service by api
        return remote_api.request_user_name(self.uid) or 'Anonymous' 

    def activate(self):
        # method now has a side effect (send message to user)
        self.status = 'activated'
        self.save()
        send_mail('Your account is activated!', '…', [self.email])
Run Code Online (Sandbox Code Playgroud)

我想要的是在我的代码中分离实体:

  1. 我的数据库,数据库级别的实体:什么包含我的应用程序?
  2. 我的应用程序的实体,业务逻辑级别:什么可以使我的应用程序?

实现可以在Django中应用的这种方法有哪些好的做法?

python django model-view-controller business-logic-layer data-access-layer

441
推荐指数
5
解决办法
9万
查看次数

DAO和Repository模式有什么区别?

数据访问对象(DAO)和存储库模式之间有什么区别?我正在开发一个使用Enterprise Java Beans(EJB3),Hibernate ORM作为基础架构,域驱动设计(DDD)和测试驱动开发(TDD)作为设计技术的应用程序.

domain-driven-design hibernate data-access-layer repository-pattern ejb-3.0

397
推荐指数
9
解决办法
14万
查看次数

存储库模式与DAL

它们是一样的吗?刚看完Rob Connery的店面教程,他们似乎是类似的技术.我的意思是,当我实现一个DAL对象时,我有GetStuff,Add/Delete等方法,我总是首先编写接口,这样我以后就可以切换db了.

我混淆了什么吗?

asp.net-mvc data-access-layer

92
推荐指数
5
解决办法
3万
查看次数

如何编写数据库调用的单元测试

我已经接近一个新项目的开始了(喘气!)我第一次尝试将单元测试包含在我的项目中.

我自己设计一些单元测试时遇到了麻烦.我有一些方法很容易测试(传入两个值并检查预期的输出).我有代码的其他部分正在做更复杂的事情,比如对数据库运行查询,我不知道如何测试它们.

public DataTable ExecuteQuery(SqlConnection ActiveConnection, string Query, SqlParameterCollection Parameters)
{
    DataTable resultSet = new DataTable();
    SqlCommand queryCommand = new SqlCommand();
    try
    {
        queryCommand.Connection = ActiveConnection;
        queryCommand.CommandText = Query;

        if (Parameters != null)
        {
            foreach (SqlParameter param in Parameters)
            {
                 queryCommand.Parameters.Add(param);
            }
        }

        SqlDataAdapter queryDA = new SqlDataAdapter(queryCommand);
        queryDA.Fill(resultSet);
    }
    catch (Exception ex)
    {
        //TODO: Improve error handling
        Console.WriteLine(ex.Message);
    }

    return resultSet;
}
Run Code Online (Sandbox Code Playgroud)

此方法基本上包含从数据库中提取一些数据所需的所有必要部分,并返回DataTable对象中的数据.

第一个问题可能是最复杂的问题:在这样的情况下我应该测试什么?

一旦解决了问题,是否要模拟数据库组件或尝试对实际数据库进行测试.

database testing integration-testing unit-testing data-access-layer

63
推荐指数
4
解决办法
5万
查看次数

提高NHibernate性能的最佳方法是什么?

我有一个使用NHibernate作为其ORM的应用程序,有时它会遇到性能问题,因为它是如何访问数据的.可以做些什么来改善NHibernate的性能?(每个答案限于一个建议)

.net nhibernate performance orm data-access-layer

61
推荐指数
4
解决办法
3万
查看次数

DAO和DAL有什么区别?

在学校学习Java后,我对DAO模式(数据访问对象)非常熟悉.但是在工作中我使用.NET.在.NET中,经常有关于DAL(数据访问层)的讨论.对我来说,他们的目的似乎很相似.所以问题是DAO和DAL基本相同吗?DAL这个术语是否只是组成,所以它不会与数据访问对象混淆?

dao data-access-layer data-access-object

46
推荐指数
2
解决办法
3万
查看次数

我应该从DAL返回IEnumerable <T>还是IQueryable <T>?

我知道这可能是意见,但我正在寻找最佳实践.

据我所知,IQueryable<T>实现IEnumerable<T>,所以在我的DAL中,我目前有方法签名,如下所示:

IEnumerable<Product> GetProducts();
IEnumerable<Product> GetProductsByCategory(int cateogoryId);
Product GetProduct(int productId);
Run Code Online (Sandbox Code Playgroud)

我应该IQueryable<T>在这里使用吗?

这两种方法的优点和缺点是什么?

请注意,我打算使用Repository模式,所以我将有一个这样的类:

public class ProductRepository {

    DBDataContext db = new DBDataContext(<!-- connection string -->);

    public IEnumerable<Product> GetProductsNew(int daysOld) {
        return db.GetProducts()
          .Where(p => p.AddedDateTime > DateTime.Now.AddDays(-daysOld ));
    }
}
Run Code Online (Sandbox Code Playgroud)

我应该改变我IEnumerable<T>IQueryable<T>吗?一个或另一个有哪些优点/缺点?

datacontext data-access-layer iqueryable linq-to-sql

38
推荐指数
3
解决办法
6184
查看次数

DAL和ORM之间的界限在哪里?

这些术语经常互换,并且显然有相当大的重叠,但同样似乎暗示人们看到一个强烈暗示的东西,说系统是一个ORM而不是它是DAL所暗示的.那是什么?如果有的话,区分这些类型系统的关键点是什么?

例如,假设我有一些代码实现了Database,Table,Column和Row类,通过自动分析现有数据库来填充它们,允许简化交互等等.它理解,实施并利用数据库实体(如外键)之间的结构关系.可以对所有实体模型进行子类化,以将特定于表的功能加载到它们上.

这个DAL到什么程度?ORM在多大程度上?为什么?

orm database-design terminology data-access-layer

36
推荐指数
3
解决办法
9053
查看次数

在程序集中找不到上下文类型

我首先使用.NET 4.0,MVC3和EF5代码.

我的解决方案分为三个项目,依赖项如下所示:

Project.Web - > Project.BLL - > Project.DAL

Project.DAL层包含我的实体框架数据上下文类和我的所有实体,但我的启动项目是Project.Web,因此它包含我的Web.config,连接字符串和实际的SQL压缩数据库.

我正在尝试启用迁移,因此我可以在不擦除现有数据的情况下向EF模型添加新表.但是,当我运行"启用 - 迁移"时,我得到了

No context type was found in the assembly 'Project.Web'.
Run Code Online (Sandbox Code Playgroud)

如果我将启动项目设置为Project.DAL,则错误更改为

Could not load assembly 'Project.Web'. (If you are using Code First Migrations inside Visual Studio this can happen if the startUp project for your solution does not reference the project that contains your migrations. You can either change the startUp project for your solution or use the -StartUpProjectName parameter.)
Run Code Online (Sandbox Code Playgroud)

有谁知道为什么会出现这个错误或者我可以做些什么来修复它?

asp.net entity-framework connection-string data-access-layer entity-framework-5

33
推荐指数
1
解决办法
4万
查看次数

为什么实体框架连接需要元数据属性?

我将DAL从使用LINQ切换到Entity Framework.因为我的应用程序根据当前用户连接到不同的数据库,所以我需要在运行时动态创建DataContext并传入适当的连接字符串.但是,当我尝试使用旧连接字符串以编程方式创建实体框架连接时,连接失败.它抱怨它没有识别连接字符串中的密钥,确切地说是"服务器".

我发现我需要这样做才能使Entity Framework连接正常工作:

EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder();
entityBuilder.Provider = "System.Data.SqlClient";
entityBuilder.ProviderConnectionString = clientConnectionString;
entityBuilder.Metadata = "res://*/xxxxxxxxxx.csdl...";
Entities entities = new Entities(entityBuilder.ToString());
Run Code Online (Sandbox Code Playgroud)

为什么是这样?
什么是元数据属性?
对于多个不同的连接,它总是一样的问题吗?
它应该是什么?
有没有办法解决?

提前致谢!

更新1:感谢更新Randolpho,但是......
我遇到此问题的全部原因是我无法将连接字符串存储在配置文件中.连接字符串在运行时由用户连接动态确定.

这是我的确切场景:
如果用户A正在连接,则应用程序从数据库A中提取数据.如果用户B正在连接,则应用程序从数据库B中提取数据.
连接字符串存储在主数据库中,并且该数字可能是无限的.每次添加用户时,我都不想进入web.config,更不用说它最终会变得巨大!

database connection entity-framework connection-string data-access-layer

32
推荐指数
2
解决办法
4万
查看次数