Back to Devexpress

DefaultWebDocumentViewerContainer.RegisterEFContextProviderFactory<T>() Method

xtrareports-devexpress-dot-xtrareports-dot-web-dot-webdocumentviewer-dot-defaultwebdocumentviewercontainer-dot-registerefcontextproviderfactory-1.md

latest4.7 KB
Original Source

DefaultWebDocumentViewerContainer.RegisterEFContextProviderFactory<T>() Method

Registers a custom factory that allows you to obtain the EF Core context from the dependency injection container.

Namespace : DevExpress.XtraReports.Web.WebDocumentViewer

Assembly : DevExpress.XtraReports.v25.2.Web.dll

NuGet Package : DevExpress.Web.Reporting.Common

Declaration

csharp
public static void RegisterEFContextProviderFactory<T>()
    where T : IEFContextProviderFactory
vb
Public Shared Sub RegisterEFContextProviderFactory(Of T As IEFContextProviderFactory)

Type Parameters

NameDescription
T

A custom factory that implements the IEFContextProviderFactory interface.

|

Remarks

You can resolve the appropriate Entity Framework Core context from the ASP.NET Core dependency injection container for reports bound to EFDataSource.

For this, implement a custom service that creates a EF Core context object for the specified data source. Register this service in IServiceCollection to obtain the EF Core context from the DI container.

Example: Reporting for ASP.NET Core - Resolve the Entity Framework Core Context from the DI Container

View Example

Implement the IEFContextProvider and IEFContextProviderFactory interfaces (the CustomEFContextProvider and CustomEFContextProviderFactory classes in this example) to create a service that allows you to get the EF Core Context.

cs
using DevExpress.Data.Entity;
using DevExpress.DataAccess.Web;
using System;
using Microsoft.Extensions.DependencyInjection;
namespace WebEFCoreApp.Services {
    public class CustomEFContextProviderFactory : IEFContextProviderFactory {
        private readonly IServiceProvider serviceProvider;
        public CustomEFContextProviderFactory(IServiceProvider serviceProvider) {
            this.serviceProvider = serviceProvider;
        }
        public IEFContextProvider Create() {
            return new CustomEFContextProvider(serviceProvider.CreateScope());
        }
    }
    public class CustomEFContextProvider : IEFContextProvider, IDisposable {
        private readonly IServiceScope scope;
        public CustomEFContextProvider(IServiceScope scope) {
            this.scope = scope;
        }

        public object GetContext(string connectionName, Type contextType) {
            // Returns the context for the specified `EFDataSource.ConnectionName`. 
            if (connectionName == "efCoreConnection")
                return scope.ServiceProvider.GetRequiredService(contextType);
            return null;
        }
        public void Dispose() {
            scope.Dispose();
        }
    }
}

Register the context in the dependency injection container. Call the AddDbContext method at the application startup to specify the connection string and the ConfigureReportingServices method to register the factory implementation.

csharp
var builder = WebApplication.CreateBuilder(args);

builder.Services.ConfigureReportingServices(configurator => {
    configurator.ConfigureWebDocumentViewer(viewerConfigurator => {
        viewerConfigurator.RegisterEFContextProviderFactory<CustomEFContextProviderFactory>();
    });
    configurator.UseAsyncEngine();
});
builder.Services.AddDbContext<OrdersContext>(options => options.UseSqlite("Data Source=file:Data/nwind.db"), ServiceLifetime.Transient);

var app = builder.Build();

See Also

DefaultWebDocumentViewerContainer Class

DefaultWebDocumentViewerContainer Members

DevExpress.XtraReports.Web.WebDocumentViewer Namespace