Asp.net mvc 使用PetaPoco';s与StructureMap的共享连接

Asp.net mvc 使用PetaPoco';s与StructureMap的共享连接,asp.net-mvc,petapoco,Asp.net Mvc,Petapoco,这是我当前在Global.asax中对StructureMap的实现: var container = (IContainer)IOCContainer.Initialize(); DependencyResolver.SetResolver(new StructureMapDependencyResolver(container)); 下面是上面提到的代码: public static class IOCContainer { public static IConta

这是我当前在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;
    }
公共静态类IOCContainer
{
公共静态IContainer初始化()
{
ObjectFactory.Initialize(x=>
{
x、 扫描(扫描=>
{
扫描。卡入总成();
scan.WithDefaultConventions();
scan.AddAllTypesOf();
});
x、 For().Use();
});
返回ObjectFactory.Container;
}
}
公共类结构MapDependencyResolver:IDependencyResolver
{
公共结构MapDependencyResolver(IContainer容器)
{
_容器=容器;
}
公共对象GetService(类型serviceType)
{
if(serviceType.IsAbstract | | serviceType.IsInterface)
{
返回_container.TryGetInstance(服务类型);
}
其他的
{
return\u container.GetInstance(serviceType);
}
}
公共IEnumerable GetServices(类型serviceType)
{
return _container.GetAllInstances()
。其中(s=>s.GetType()==serviceType);
}
专用只读IContainer\u容器;
}
我读到使用共享连接可能会稍微提高性能,所以我想知道如何在我的MVC应用程序中使用它。我想我必须将一个新创建的PetaPoco.Database对象传递给我的存储库的构造函数


谢谢

当您运行使用PetaPoco获得的T4时,您将获得以下可用信息

{yourmodel}.ConnectionStringDB.GetInstance();
我这是在寻找一个Instance,如果有,它就会使用它,如果没有,它会创建另一个Instance


不过我可能错了。。我记不清了。

我只能为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.Database,它是在上面的代码段中构造的。现在,我的存储库可以使用共享数据库连接。在使用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++;
}

如果有人想知道,我就这么说:

x.For<PetaPoco.Database>().Singleton().Use(() => new PetaPoco.Database("DBConnection"));
x.For().Singleton().Use(()=>newpetapoco.Database(“DBConnection”);

我没有使用T4不幸的是yyUp,因为我拥有的数据库的列名都是讨厌的大写字母和下划线,所以我正在创建POCO,并用列名装饰属性,以保持代码干净。我刚想到另一个问题。如何进行单元测试以查看应用程序是否正在使用共享连接?此外,我可能遗漏了一些内容,但如果您有一个repo,该repo执行人员获取,例如,它将再次关闭它,因为它一次执行sql的一个连接。如果您的web应用程序上有5个请求,它是否会使用已创建的对象?
x.For<PetaPoco.Database>().Singleton().Use(() => new PetaPoco.Database("DBConnection"));