这是我在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对象传递给我的存储库的构造函数吗?
由于
答案 0 :(得分:3)
我只能代表Autofac,因为我在项目中使用的是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就是我的renameapaced petapoco.cs。
在Autofac中,您可以通过告诉它通过WithParameters()传入哪些参数来告诉它要调用哪个版本的构造函数。构造对象时,它会找到具有匹配参数的构造函数。
每次构造函数都注入了依赖项时,它会在整个http请求中使用相同的petapoco数据库对象,因为这就是我告诉Autofac要做的事情(InstancePerHttpRequest)
我的控制器构造函数将INextMatchService作为依赖项,然后将INextMatchRepository作为依赖项:
public NextMatchRepository( Database database, ISessionWrapper sessionWrapper)
{
this._database = database;
this._sessionWrapper = sessionWrapper;
}
“数据库”类型是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++;
}
答案 1 :(得分:2)
如果有人想知道,我就去了:
x.For<PetaPoco.Database>().Singleton().Use(() => new PetaPoco.Database("DBConnection"));
答案 2 :(得分:0)
当您运行PetaPoco获得的T4时,您将获得以下信息。
{yourmodel}.ConnectionStringDB.GetInstance();
我这是寻找一个实例,如果有一个,那么它会使用它,如果没有它会创建另一个。
我可能错了,但我完全记不住了。