从 Entityspaces(Tiraggo) 过渡到 Servicestack Ormlite

2023-12-01

目前我们正在从 Entityspaces(Tiraggo) 迁移到 Servicestack Ormlite。

其中一点就是打开和关闭DBConnection的方式。

我对这种比较表示歉意,但它对这个问题很有用。在 Tiraggo 中,在我的 wep 应用程序中,在 global.asax.cs 中我放置了以下内容:

    protected void Application_Start(object sender, EventArgs e)
    {
        Tiraggo.Interfaces.tgProviderFactory.Factory = new Tiraggo.Loader.tgDataProviderFactory();
    }

在 web.config 中存在 Tiraggo 部分、连接字符串,ORM 完成其余的工作。

在使用类的过程中我们只需这样做:

User user = new User(); user.Name="some"; user.Comment = "some"; user.Save();

我不打开、关闭 DBConnection。这对于程序员来说是透明的。只需创建实例类并使用它们即可。

我定义了一个类、一个存储库,仅此而已。没有数据库定义或交互。一切都发生在 Webforms 应用程序中,数据层位于同一应用程序内。

当我们迁移到 Servicestack ORMLite 时,我看到 DBConnection 的打开也在 globlal.asax.cs 内部,但它引用的是服务,而不是类或存储库。

   public class AppHost : AppHostBase
{
    public AppHost() : base("Hello ServiceStack", typeof(HelloService).Assembly) {}
    public override void Configure(Container container) {}
}

所以我的第一个问题是:如果我没有服务(HelloService),我只有类或存储库,我该如何使用它。所以我不能将这种技术用于我的数据库的 DBConnection。

我还看到访问数据库,我需要一个开放的连接。我尝试这样做:

            using (var Db = DbFactory.Conn.OpenDbConnection())
        {
            return Db.SingleById<Anio>(id);
        }

后来,我找到了一个像我正在寻找的样本,Pluralsight 视频“.NET Micro ORMs”Steve Mihcelotti,他只是打开连接,但从未关闭它,也从未使用“using”语法。

所以我的两个问题是:

1)有没有一种方法可以像所有使用servicestack ormlite的示例一样打开DbFactory(dbConnection),但不使用服务(我不使用服务,我想使用Ormlite,但只使用类和存储库) 2)有没有一种方法可以在每次访问类或存储库时连接到数据库,而不使用“using”语法,或者 3)唯一的方法是Pluralsight视频中显示的方法,即。打开连接在每个方法中抛出 using 语法(前往类)

我希望我说清楚了。


好的一点是IDbConnectionFactory它是一个线程安全的单例,可以安全地传递和引用,因为它本身不持有任何打开的资源(即数据库连接)。

提供良好调用站点 API 的惰性模式是存储库库 class:

public abstract class RepositoryBase : IDisposable, IRepository
{
    public virtual IDbConnectionFactory DbFactory { get; set; }

    IDbConnection db;
    public virtual IDbConnection Db
    {
        get { return db ?? (db = DbFactory.OpenDbConnection()); }
    }

    public virtual void Dispose()
    {
        if (db != null)
            db.Dispose();
    }
}

这与 ServiceStack 的模式相同Service类用于提供一个很好的 API,只有在服务中使用时才会打开,例如:

public class MyRepository : RepositoryBase
{
    public Foo GetFooById(int id)
    {
        return Db.SingleById<Foo>(id);
    }
}

注意:此模式确实期望您的依赖项将在使用后被释放。

另一种选择是利用 IOC 注入 OpenIDbConnection具有托管生命周期范围,例如:

container.Register<IDbConnection>(c => 
    c.Resolve<IDbConnectionFactory>().OpenDbConnection())
    .ReusedWithin(ReuseScope.Request);

连接的生命周期取决于您首选的 IOC。

不使用 IOC

虽然使用 IOC 来管理应用程序依赖项并提供松散耦合通常是一种很好的做法,但如果您不想使用 IOC,您也可以DbFactory静态属性,例如:

public abstract class RepositoryBase : IDisposable
{
    public static IDbConnectionFactory DbFactory { get; set; }

    IDbConnection db;
    public virtual IDbConnection Db
    {
        get { return db ?? (db = DbFactory.OpenDbConnection()); }
    }

    public virtual void Dispose()
    {
        if (db != null)
            db.Dispose();
    }
}

您可以在启动时直接初始化,例如:

protected void Application_Start(object sender, EventArgs e)
{
    RepositoryBase.DbFactory = new OrmLiteConnectionFactory(
        connectionString, SqlServer.Provider);
}

注意:如果您不使用 IOC,那么您需要确保存储库类的实例(例如MyRepository)使用后丢弃。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 Entityspaces(Tiraggo) 过渡到 Servicestack Ormlite 的相关文章

  • 如何使用 ServiceStack JsonSerializer 序列化 ExpandoObject?

    是否可以让 ServiceStack JsonSerializer 将 ExpandoObject 序列化为平面对象而不是字典 大致类似于这样 x xvalue y Date 1313966045485 我正在尝试比较 JSON 序列化Ex
  • 存储库和数据映射器模式

    在大量阅读有关存储库和数据映射器的内容后 我决定在测试项目中实现这些模式 由于我对这些不熟悉 我想了解您对我如何在一个简单的项目中实现这些的看法 杰里米 米勒 说 做一些不平凡的个人编码项目 您可以在其中自由地尝试设计模式 但我不知道我做的
  • Github 下载文件夹为 zip

    如何为我的 Github 存储库的访问者提供一个链接 以将我的存储库的 builds 文件夹下载为 zip 文件 该文件夹包含应用程序所需的可执行文件 着色器和纹理 当然 我可以手动构建该目录的 zip 文件并将其添加到存储库中 但这会导致
  • 连接两个 Git 存储库的历史记录?

    我有一个旧的 Git 存储库 请调用它app 然后 一年后 我想从头开始重建应用程序 所以我创建了一个新的存储库 称之为app 2 现在 我意识到我应该创建一个新分支或其他东西 而不是一个新的存储库 因为我想移动app 2在之上app然后摆
  • ServiceStack 验证并不总是触发

    因此 我尝试使用 RavenDB 和 ServiceStack 构建端到端集成测试套件 但遇到了一个非常奇怪的问题 即验证无法对某些请求运行 这真的很奇怪 我不确定我做错了什么 我正在使用 NCrunch 有时测试通过 有时失败 希望这是一
  • 将新文件推送到新存储库 Git

    我是 git 新手 还没有完全了解工作流程 因此 我在 github com 上创建了一个存储库 并且能够从我的计算机推送所有文件 现在我已经在 github 上创建了一个新的存储库 并在我的计算机上创建了一个新文件夹 所有内容都从新文件夹
  • 如何在 EF4 中获取实体的第一个 EntityKey 名称

    如何获取 Entity Framework 4 实体的第一个 EntityKey 名称 因为我正在构建存储库系统 并且我想通过 Id 获取项目 EF 中的主键是实体的第一个实体键 我正在使用这个代码 public virtual TEnti
  • ServiceStack自定义用户身份验证

    有谁有一个关于如何按照本建议使用 int RefId 的实际示例question https stackoverflow com questions 11117469 how can i extend servicestack authen
  • 用作 ServiceStack 的 IoC 时在 autofac 中配置生命周期范围

    我目前正在使用 AutoFac 作为我们的 ServiceStack Web 服务应用程序的 DI 容器 我能够配置接线和所有内容 但在阅读了有关范围的部分后 我不知道在注册我的组件时最好使用哪个范围 在我们的特定情况下 我认为 PerHt
  • 如何减少 Bitbucket 上的 git repo 大小?

    我的问题摘要 在我向两个现有文件添加了几百个字节后 我在 Bitbucket 上的一个私人存储库的大小突然增加了一倍多 该存储库现在超过 2GB 这导致 Bitbucket 将其置于只读模式 因为它处于只读模式 所以我无法推送会减少存储库大
  • 我如何模拟 ServiceStack IHttpRequest

    我正在尝试使用请求过滤器对将项目注入 IHttpRequest Items 的服务进行单元测试 this RequestFilters Add req res dto gt simplified for readability var re
  • ServiceStack操作命名约定可以被覆盖吗?

    我需要为 ServiceStack 服务定义一个 DTO 类 服务堆栈使用基于类名的约定 因此如果我的类称为 Transmission 则相应的服务将使用 HTTP 操作中使用的类型为 Transmission 的公开元数据 但我已经有了
  • IdentityServer3 与 ServiceStack 和 MVC 客户端

    我是 IdentityServer3 的新手 刚刚开始设置它 似乎进展顺利 我一直在为 MVC 应用程序开发混合流程 类似于 Kevin Dockx 的 Pluralsight 课程中所示的内容 http www pluralsight c
  • 将存储库移至另一台计算机

    我已将存储库从计算机 A 移至计算机 B 我已验证等待推送的提交仍在 B 上 但整个存储库 每个文件 均未暂存 我不想添加它们并将它们作为提交推送 因为从复制存储库到粘贴它 我没有更改每个文件 当我移动存储库时 它只有等待推送的提交 而不是
  • ServiceStack 身份验证中 httponly ss-tok bearerToken cookie 的意义是什么

    我从安全角度理解 Set Cookie 响应标头值的 httponly 标志的概念并防止 XSS 攻击 我不明白的是 ServiceStack 对保存 bearerToken 的 ss tok cookie 做了什么 根据服务堆栈文档 ht
  • 检查没有 .svn 文件的 svn 存储库

    我的专用服务器 Centos 5 5 上有一个 svn 存储库 位于 var svn myRepository 我只想将这些文件复制到我的生产文件夹 var www myWebapp 中 据我了解 SVN 我只能在本地项目文件夹上使用 sv
  • 如何使用 ServiceStack 作为 OAuth2.0 的资源服务器来构建安全的 api?

    我已经使用构建了 OAuth2 0 授权服务器点网开放验证 https github com AArnott dotnetopenid它将管理身份验证 授权并将 accessToken 分配给调用者 调用者将使用访问令牌访问资源服务器上的
  • 如何在 GitHub 中创建嵌套存储库?

    我可以通过创建一个存储库https github com https github com say repo 并有 https github com username repo git 如何创建另一个存储库 例如sub repo 置于rep
  • OS X Server - 机器人无法从存储库获取源代码

    我安装了以前版本的 OS X Server 并且运行良好 但是当我安装升级到 3 2 1 时 我发现我的机器人都无法正常工作 这些是我在每次尝试集成时遇到的问题 构建服务错误无法将数据放入缓冲区 1 构建服务警告由于找不到工作副本 源代码管
  • 传统 n 层设计中具有多个项目的 Git 存储库的最佳实践

    我正在从集中式 SCM 系统切换到 GIT 好吧 我承认是哪一个 它是 Visual SourceSafe 因此 除了克服 Git 命令和工作流程的学习曲线之外 我目前面临的最大问题是如何将我们当前的存储库迁移到 Git 对于单个存储库或多

随机推荐