此时此刻,我们正在从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语法(到类)
我希望我说得够清楚了。
发布于 2014-10-10 11:14:20
IDbConnectionFactory的好处是它是一个ThreadSafe单例,可以安全地传递和引用,因为它本身不保存任何开放的资源(即DB连接)。
RepositoryBase类是一个惰性模式,它提供了一个很好的调用站点API:
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注入一个具有托管生命周期范围的开放式IDbConnection,例如:
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)的实例在使用后被处理掉。
https://stackoverflow.com/questions/26290983
复制相似问题