DevExpress v25.1 Update — Your Feedback Matters
Our What's New in v25.1 webpage includes product-specific surveys. Your response to our survey questions will help us measure product satisfaction for features released in this major update and help us refine our plans for our next major release.
Take the survey
Not interested
Follow the steps below to add a custom Object Space provider to your application:
Create a custom object space class
Create a custom object space provider class
Configure your application to use custom object space provider
The following steps add a custom XPO object space provider in a .NET Framework application.
# 1. Create a Custom Object Space Class
Create a custom object space class and override the methods you want to customize. The following examples customize the DoCommit
method:
public class MyCustomSecuredEFCoreObjectSpace : SecuredEFCoreObjectSpace {
public MyCustomSecuredEFCoreObjectSpace (ITypesInfo typesInfo, IEntityStore entityStore, Func<DbContext> createDbContext, ISecurityStrategyBase security )
: base (typesInfo, entityStore, createDbContext, security ) { }
protected override void DoCommit ( ) {
base .DoCommit();
}
}
public class MyCustomEFCoreObjectSpace : EFCoreObjectSpace {
public MyCustomEFCoreObjectSpace (ITypesInfo typesInfo, IEntityStore entityStore, Func<DbContext> createDbContext )
: base (typesInfo, entityStore, createDbContext ) { }
protected override void DoCommit ( ) {
base .DoCommit();
}
}
public class MyCustomSecuredXPObjectSpace : SecuredXPObjectSpace {
public MyCustomSecuredXPObjectSpace (ITypesInfo typesInfo, XpoTypeInfoSource xpoTypeInfoSource, CreateUnitOfWorkHandler createUnitOfWorkDelegate, ISecurityStrategyBase security )
: base (typesInfo, xpoTypeInfoSource, createUnitOfWorkDelegate, security ) { }
protected override void DoCommit ( ) {
base .DoCommit();
}
}
public class MyCustomXPObjectSpace : XPObjectSpace {
public MyCustomXPObjectSpace (ITypesInfo typesInfo, XpoTypeInfoSource xpoTypeInfoSource, CreateUnitOfWorkHandler createUnitOfWorkDelegate )
: base (typesInfo, xpoTypeInfoSource, createUnitOfWorkDelegate ) { }
protected override void DoCommit ( ) {
base .DoCommit();
}
}
public class MyCustomXPObjectSpace : XPObjectSpace {
public MyCustomXPObjectSpace (ITypesInfo typesInfo, XpoTypeInfoSource xpoTypeInfoSource, CreateUnitOfWorkHandler createUnitOfWorkDelegate )
: base (typesInfo, xpoTypeInfoSource, createUnitOfWorkDelegate ) { }
protected override void DoCommit ( ) {
base .DoCommit();
}
}
public class MyCustomNonPersistentObjectSpace : NonPersistentObjectSpace {
public MyCustomNonPersistentObjectSpace (IServiceProvider serviceProvider, ITypesInfo typesInfo, IEntityStore entityStore )
: base (serviceProvider, typesInfo, entityStore ) { }
protected override void DoCommit ( ) {
base .DoCommit();
}
}
Inherit from the XPObjectSpace class and override the methods you want to customize. The following example customizes the DoCommit
method:
C#
public class MyCustomXPObjectSpace : XPObjectSpace {
public MyCustomXPObjectSpace (ITypesInfo typesInfo, XpoTypeInfoSource xpoTypeInfoSource, CreateUnitOfWorkHandler createUnitOfWorkDelegate )
: base (typesInfo, xpoTypeInfoSource, createUnitOfWorkDelegate ) { }
protected override void DoCommit ( ) {
base .DoCommit();
}
}
# 2. Create a Custom Object Space Provider Class
Create a custom object space provider class. Override the CreateObjectSpaceCore
method (CreateObjectSpace
for non-persistent object space provider) to return your custom object space instance.
public class MyCustomSecuredEFCoreObjectSpaceProvider <TDbContext >
: SecuredEFCoreObjectSpaceProvider <TDbContext > where TDbContext : DbContext {
readonly ISelectDataSecurityProvider selectDataSecurityProvider;
public MyCustomSecuredEFCoreObjectSpaceProvider (ISelectDataSecurityProvider selectDataSecurityProvider, IDbContextFactory<TDbContext> dbContextFactory )
: base (selectDataSecurityProvider, dbContextFactory ) {
this .selectDataSecurityProvider = selectDataSecurityProvider;
}
protected override EFCoreObjectSpace CreateObjectSpaceCore ( ) {
return new MyCustomSecuredEFCoreObjectSpace(TypesInfo, EntityStore, CreateDbContext, (ISecurityStrategyBase )selectDataSecurityProvider);
}
}
public class MyCustomEFCoreObjectSpaceProvider <TDbContext >
: EFCoreObjectSpaceProvider <TDbContext > where TDbContext : DbContext {
public MyCustomEFCoreObjectSpaceProvider (IDbContextFactory<TDbContext> dbContextFactory )
: base (dbContextFactory ) { }
protected override EFCoreObjectSpace CreateObjectSpaceCore ( ) {
return new MyCustomEFCoreObjectSpace(TypesInfo, EntityStore, CreateDbContext);
}
}
public class MyCustomSecuredObjectSpaceProvider : SecuredObjectSpaceProvider {
public MyCustomSecuredObjectSpaceProvider (IServiceProvider serviceProvider, ISelectDataSecurityProvider selectDataSecurityProvider, IXpoDataStoreProvider dataStoreProvider )
: base (selectDataSecurityProvider, dataStoreProvider, true ) {
}
protected override IObjectSpace CreateObjectSpaceCore ( ) {
var securityStrategy = ServiceProvider.GetRequiredService<ISecurityStrategyBase >();
return new MyCustomSecuredXPObjectSpace(TypesInfo, XpoTypeInfoSource, () => CreateUnitOfWork(DataLayer), securityStrategy);
}
}
public class MyCustomMiddleTierObjectSpaceProvider : MiddleTierServerObjectSpaceProvider {
public MyCustomMiddleTierObjectSpaceProvider (IServiceProvider serviceProvider )
: base (serviceProvider,
(WebApiSecuredDataServerClient )serviceProvider.GetRequiredService <WebApiSecuredDataServerClientBase >( ),
serviceProvider.GetRequiredService <IMiddleTierXpoTypeInfoSourceProvider >( )) { }
protected override XPObjectSpace CreateObjectSpaceCore (ITypesInfo typesInfo, XpoTypeInfoSource xpoTypeInfoSource, CreateUnitOfWorkHandler createUnitOfWork ) {
return new MyCustomXPObjectSpace(TypesInfo, XpoTypeInfoSource, () => CreateUnitOfWork(DataLayer));
}
}
public class MyCustomObjectSpaceProvider : XPObjectSpaceProvider {
public MyCustomObjectSpaceProvider (IServiceProvider serviceProvider, IXpoDataStoreProvider dataStoreProvider )
: base (serviceProvider, dataStoreProvider, true ) {
}
protected override IObjectSpace CreateObjectSpaceCore ( ) {
return new MyCustomXPObjectSpace(TypesInfo, XpoTypeInfoSource, () => CreateUnitOfWork(DataLayer));
}
}
public class MyCustomNonPersistentObjectSpaceProvider : NonPersistentObjectSpaceProvider {
public MyCustomNonPersistentObjectSpaceProvider (IServiceProvider serviceProvider )
: base (serviceProvider ) { }
public override IObjectSpace CreateObjectSpace ( ) {
return new NonPersistentObjectSpace (ServiceProvider, TypesInfo, EntityStore);
}
}
Inherit from the XPObjectSpaceProvider class, override the CreateObjectSpaceCore
method to return your custom MyCustomXPObjectSpace
instance.
If you use integrated mode of the security system or middle tier security , inherit SecuredObjectSpaceProvider or MiddleTierServerObjectSpaceProvider
instead of XPObjectSpaceProvider accordingly.
C#
public class MyCustomXPObjectSpaceProvider : XPObjectSpaceProvider {
public MyCustomXPObjectSpaceProvider (IXpoDataStoreProvider dataStoreProvider, bool threadSafe ) : base (dataStoreProvider, threadSafe ) { }
public MyCustomXPObjectSpaceProvider (string connectionString, IDbConnection connection, bool threadSafe ) : base (connectionString, connection, threadSafe ) { }
protected override IObjectSpace CreateObjectSpaceCore ( ) {
return new MyCustomXPObjectSpace(TypesInfo, XpoTypeInfoSource, () => CreateUnitOfWork(DataLayer));
}
}
# 3. Configure Your Application to Use Custom Object Space Provider
Use the CustomCreateObjectSpaceProvider
method to add your custom object space provider to the application.
File: MySolution.Blazor.Server\Startup.cs , MySolution.Win\Startup.cs , MySolution.WebApi\Startup.cs
builder.ObjectSpaceProviders
.AddSecuredEFCore(o => {
o.CustomCreateObjectSpaceProvider = (context) => {
var selectDataSecurityProvider = context.ServiceProvider.GetRequiredService<ISelectDataSecurityProvider>();
var dbContextFactory = context.ServiceProvider.GetRequiredService<IDbContextFactory<MainDemoDbContext>>();
return new MyCustomSecuredEFCoreObjectSpaceProvider<ApplicationDbContext>(selectDataSecurityProvider, dbContextFactory);
};
})
.WithDbContext<ApplicationDbContext>(...)
builder.ObjectSpaceProviders
.AddEFCore(o => {
o.CustomCreateObjectSpaceProvider = (context) => {
var dbContextFactory = context.ServiceProvider.GetRequiredService<IDbContextFactory<MainDemoDbContext>>();
return new MyCustomEFCoreObjectSpaceProvider<ApplicationDbContext>(dbContextFactory);
};
})
.WithDbContext<ApplicationDbContext>(...)
var dataStoreProviderManager = new DevExpress.ExpressApp.ApplicationBuilder.DataStoreProviderManager();
builder.ObjectSpaceProviders
.AddSecuredXpo((serviceProvider, options) => {
options.ConnectionString = ...;
options.CustomCreateObjectSpaceProvider = (context) => {
var selectDataSecurityProvider = context.ServiceProvider.GetRequiredService<ISelectDataSecurityProvider>();
var dataStoreProvider = dataStoreProviderManager.GetSharedDataStoreProvider(options.ConnectionString, true );
return new MyCustomSecuredObjectSpaceProvider(context.ServiceProvider, selectDataSecurityProvider, dataStoreProvider);
};
})
builder.Security
.UseMiddleTierMode(options => {
options.BaseAddress = new Uri("http://localhost:5000/" );
options.Events.CustomCreateObjectSpaceProvider = (context) => {
return new MyCustomMiddleTierObjectSpaceProvider(context.ServiceProvider, ...);
};
})
var dataStoreProviderManager = new DevExpress.ExpressApp.ApplicationBuilder.DataStoreProviderManager();
builder.ObjectSpaceProviders
.AddXpo((serviceProvider, options) => {
options.ConnectionString = ...;
options.CustomCreateObjectSpaceProvider = (context) => {
var dataStoreProvider = dataStoreProviderManager.GetSharedDataStoreProvider(options.ConnectionString, true );
return new MyCustomObjectSpaceProvider(context.ServiceProvider, dataStoreProvider);
};
})
builder.ObjectSpaceProviders
.AddNonPersistent((serviceProvider, options) => {
options.CustomCreateObjectSpaceProvider = (context) => {
return new MyCustomNonPersistentObjectSpaceProvider(context.ServiceProvider);
};
});
Call the CreateDefaultObjectSpaceProvider
method and add a MyCustomXPObjectSpaceProvider
instance to the ObjectSpaceProviders list.
File: WinApplication.cs or WebApplication.cs
C#
protected override void CreateDefaultObjectSpaceProvider (CreateCustomObjectSpaceProviderEventArgs args ) {
args.ObjectSpaceProviders.Add(new MyCustomXPObjectSpaceProvider(args.ConnectionString, args.Connection));
}