首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Entityspaces(Tiraggo)到Servicestack Ormlite的过渡

从Entityspaces(Tiraggo)到Servicestack Ormlite的过渡
EN

Stack Overflow用户
提问于 2014-10-10 10:23:32
回答 1查看 478关注 0票数 1

此时此刻,我们正在从Entityspaces(Tiraggo)迁移到Servicestack Ormlite。

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

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

代码语言:javascript
复制
    protected void Application_Start(object sender, EventArgs e)
    {
        Tiraggo.Interfaces.tgProviderFactory.Factory = new Tiraggo.Loader.tgDataProviderFactory();
    }

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

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

代码语言:javascript
复制
User user = new User(); user.Name="some"; user.Comment = "some"; user.Save();

我没有打开,关闭了一个DBConnection。它对程序员来说是透明的。只需创建实例类并使用它们。

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

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

代码语言:javascript
复制
   public class AppHost : AppHostBase
{
    public AppHost() : base("Hello ServiceStack", typeof(HelloService).Assembly) {}
    public override void Configure(Container container) {}
}

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

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

代码语言:javascript
复制
            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语法(到类)

我希望我说得够清楚了。

EN

回答 1

Stack Overflow用户

发布于 2014-10-10 11:14:20

IDbConnectionFactory的好处是它是一个ThreadSafe单例,可以安全地传递和引用,因为它本身不保存任何开放的资源(即DB连接)。

RepositoryBase类是一个惰性模式,它提供了一个很好的调用站点API:

代码语言:javascript
复制
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,只有在服务中使用它时才会打开,例如:

代码语言:javascript
复制
public class MyRepository : RepositoryBase
{
    public Foo GetFooById(int id)
    {
        return Db.SingleById<Foo>(id);
    }
}

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

另一种选择是利用你的IOC注入一个具有托管生命周期范围的开放式IDbConnection,例如:

代码语言:javascript
复制
container.Register<IDbConnection>(c => 
    c.Resolve<IDbConnectionFactory>().OpenDbConnection())
    .ReusedWithin(ReuseScope.Request);

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

不使用IOC

虽然使用IOC来管理您的应用程序依赖项并提供松耦合通常是一个好的实践,但如果您不想使用IOC,您也可以将DbFactory设置为静态属性,例如:

代码语言:javascript
复制
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();
    }
}

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

代码语言:javascript
复制
protected void Application_Start(object sender, EventArgs e)
{
    RepositoryBase.DbFactory = new OrmLiteConnectionFactory(
        connectionString, SqlServer.Provider);
}

注意:如果你没有使用IOC,那么你需要确保你的仓库类(例如MyRepository)的实例在使用后被处理掉。

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

https://stackoverflow.com/questions/26290983

复制
相关文章

相似问题

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