使用 PetaPoco 与 StructureMap 的共享连接
Posted
技术标签:
【中文标题】使用 PetaPoco 与 StructureMap 的共享连接【英文标题】:Using PetaPoco's Shared Connection with StructureMap 【发布时间】:2011-11-17 18:45:11 【问题描述】:这是我当前在 Global.asax 中的 StructureMap 实现:
var container = (IContainer)IOCContainer.Initialize();
DependencyResolver.SetResolver(new StructureMapDependencyResolver(container));
下面是上面引用的代码:
public static class IOCContainer
public static IContainer Initialize()
ObjectFactory.Initialize(x =>
x.Scan(scan =>
scan.TheCallingAssembly();
scan.WithDefaultConventions();
scan.AddAllTypesOf<IController>();
);
x.For<IConfigRepository>().Use<ConfigRepository>();
);
return ObjectFactory.Container;
public class StructureMapDependencyResolver : IDependencyResolver
public StructureMapDependencyResolver(IContainer container)
_container = container;
public object GetService(Type serviceType)
if (serviceType.IsAbstract || serviceType.IsInterface)
return _container.TryGetInstance(serviceType);
else
return _container.GetInstance(serviceType);
public IEnumerable<object> GetServices(Type serviceType)
return _container.GetAllInstances<object>()
.Where(s => s.GetType() == serviceType);
private readonly IContainer _container;
我读到使用共享连接可能会稍微提高性能,所以我想知道如何在我的 MVC 应用程序中使用它。我想我必须将一个新创建的 PetaPoco.Database 对象传递给我的存储库的构造函数??
谢谢
【问题讨论】:
【参考方案1】:我只能代表 Autofac 发言,因为这是我在项目中使用的。这可能不适用于您尝试做的事情,但我不妨分享一下。为了获得每个 http 请求的 petapoco 数据库对象,我在 global.asax.cs 中有这个配置
builder.RegisterType<MyProject.ObjectRelationalMapper.PetaPoco.Database>()
.As<MyProject.ObjectRelationalMapper.PetaPoco.Database>()
.WithParameters( new List<NamedParameter>() new NamedParameter( "connectionStringName", "MyProjectConnectionString"))
.InstancePerHttpRequest();
MyProject.ObjectRelationalMapper.PetaPoco 只是我重命名的 petapoco.cs。
在 Autofac 中,您可以告诉它要调用哪个版本的构造函数,方法是告诉它您通过 WithParameters() 传入的参数。在构造对象时,它会找到具有匹配参数的构造函数。
每次构造函数注入其依赖项时,它都会在整个 http 请求中使用相同的 petapoco 数据库对象,因为这就是我告诉 Autofac 要做的 (InstancePerHttpRequest)
我的控制器构造函数将 INextMatchService 作为依赖项,而该依赖项又将 INextMatchRepository 作为依赖项:
public NextMatchRepository( Database database, ISessionWrapper sessionWrapper)
this._database = database;
this._sessionWrapper = sessionWrapper;
“Database”类型为MyProject.ObjectRelationalMapper.PetaPoco.Database,在上述代码sn-p中构造。现在我的存储库可以使用共享数据库连接。当您使用 Petapoco 函数时,它会检查是否已经存在要使用的连接,如果存在则递增计数器并使用对象:
// Open a connection (can be nested)
public void OpenSharedConnection()
if (_sharedConnectionDepth == 0)
_sharedConnection = _factory.CreateConnection();
_sharedConnection.ConnectionString = _connectionString;
_sharedConnection.Open();
if (KeepConnectionAlive)
_sharedConnectionDepth++;// Make sure you call Dispose
_sharedConnectionDepth++;
【讨论】:
谢谢。我刚刚想到另一个问题。您如何进行单元测试以查看应用程序是否正在使用共享连接? 另外,我可能会遗漏一些东西,但是如果您有一个执行 Fetch of Person 的 repo,它将再次关闭它,因为它一次执行一个 sql。如果您的网络应用程序有 5 个请求,那么它是否会使用已创建的对象?【参考方案2】:如果有人想知道,我会选择这个:
x.For<PetaPoco.Database>().Singleton().Use(() => new PetaPoco.Database("DBConnection"));
【讨论】:
【参考方案3】:当您运行通过 PetaPoco 获得的 T4 时,您将获得以下可用的内容..
yourmodel.ConnectionStringDB.GetInstance();
我这会寻找一个实例,如果有则使用它,如果没有则创建另一个。
不过我可能是错的。我记不太清了。
【讨论】:
不幸的是我没有使用 T4 是的,因为我拥有的数据库在列名的地方都有讨厌的大写和下划线,所以我正在创建 POCO 并用列名装饰属性以保持代码干净以上是关于使用 PetaPoco 与 StructureMap 的共享连接的主要内容,如果未能解决你的问题,请参考以下文章