The following code is now added by the Solution Wizard to the Global.asax.cs file for XPO-based applications (the behavior of existing applications is not changed):
C#protected override void CreateDefaultObjectSpaceProvider(CreateCustomObjectSpaceProviderEventArgs args) {
CreateXPObjectSpaceProvider(args.ConnectionString, args);
args.ObjectSpaceProviders.Add(new NonPersistentObjectSpaceProvider(TypesInfo, null));
}
private void CreateXPObjectSpaceProvider(string connectionString, CreateCustomObjectSpaceProviderEventArgs e) {
System.Web.HttpApplicationState application = (System.Web.HttpContext.Current != null) ? System.Web.HttpContext.Current.Application : null;
IXpoDataStoreProvider dataStoreProvider = null;
if(application != null && application["DataStoreProvider"] != null) {
dataStoreProvider = application["DataStoreProvider"] as IXpoDataStoreProvider;
e.ObjectSpaceProvider = new XPObjectSpaceProvider(dataStoreProvider, true);
}
else {
if(!String.IsNullOrEmpty(connectionString)) {
connectionString = DevExpress.Xpo.XpoDefault.GetConnectionPoolString(connectionString);
dataStoreProvider = new ConnectionStringDataStoreProvider(connectionString, true);
}
else if(e.Connection != null) {
dataStoreProvider = new ConnectionDataStoreProvider(e.Connection);
}
if (application != null) {
application["DataStoreProvider"] = dataStoreProvider;
}
e.ObjectSpaceProvider = new XPObjectSpaceProvider(dataStoreProvider, true);
}
}
A single IXpoDataStoreProvider and IDataStore are created per each database, and they are shared by all users. Note that the true value is passed to the useCachedDataStore parameter of the ConnectionStringDataStoreProvider constructor. This parameter specifies if the cached IDataStore instance is used or a new IDataStore instance is created per each CreateWorkingStore method call.
When Object Space Providers are created in the overridden CreateDefaultObjectSpaceProvider method, providers (and their connections) are disposed of when the application is disposed of (e.g. on re-logon). When providers are created using the CreateCustomObjectSpaceProvider event, providers and their connections are disposed of together with their application too. Set the event's CreateCustomObjectSpaceProviderEventArgs.IsObjectSpaceProviderOwner parameter to false to cancel dispose of providers together with the application in this scenario:
C#private void Instance_CreateCustomObjectSpaceProvider(object sender, CreateCustomObjectSpaceProviderEventArgs e) {
IXpoDataStoreProvider dataStoreProvider = null;
if(Application["DataStoreProvider"] != null) {
dataStoreProvider = Application["DataStoreProvider"] as IXpoDataStoreProvider;
e.ObjectSpaceProvider = new SecuredObjectSpaceProvider((ISelectDataSecurityProvider)WebApplication.Instance.Security, dataStoreProvider, true);
}
else {
if(!String.IsNullOrEmpty(e.ConnectionString)) {
string connectionString = DevExpress.Xpo.XpoDefault.GetConnectionPoolString(e.ConnectionString);
dataStoreProvider = new ConnectionStringDataStoreProvider(connectionString, true);
}
else if (e.Connection != null){
dataStoreProvider = new ConnectionDataStoreProvider(e.Connection);
}
Application["DataStoreProvider"] = dataStoreProvider;
e.ObjectSpaceProvider = new SecuredObjectSpaceProvider((ISelectDataSecurityProvider)WebApplication.Instance.Security, dataStoreProvider, true);
}
e.IsObjectSpaceProviderOwner = false;
}