4

这是我当前在 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 对象传递给我的存储库的构造函数?

谢谢

4

3 回答 3

3

我只能代表 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,它是在上面的代码片段中构造的。现在我的存储库可以使用共享数据库连接。当您使用 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++;
}
于 2011-09-15T19:50:35.223 回答
2

如果有人想知道,我会这样做:

x.For<PetaPoco.Database>().Singleton().Use(() => new PetaPoco.Database("DBConnection"));
于 2011-09-22T13:01:27.407 回答
0

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

{yourmodel}.ConnectionStringDB.GetInstance();

我这会寻找一个实例,如果有,那么它会使用它,如果没有,它会创建另一个。

不过,我可能是错的。我记不清了。

于 2011-09-15T13:25:52.160 回答