diff --git a/NewPlatform.Flexberry.ORM.ODataService/Model/DataObjectEdmModel.cs b/NewPlatform.Flexberry.ORM.ODataService/Model/DataObjectEdmModel.cs index 709a92ae..a8a3caeb 100644 --- a/NewPlatform.Flexberry.ORM.ODataService/Model/DataObjectEdmModel.cs +++ b/NewPlatform.Flexberry.ORM.ODataService/Model/DataObjectEdmModel.cs @@ -85,40 +85,25 @@ public class DataObjectEdmModel : EdmModel private readonly IDictionary _registeredEntitySets = new Dictionary(); private readonly IDictionary> _typeHierarchy = new Dictionary>(); - public DataObjectEdmModel(DataObjectEdmMetadata metadata, IDataObjectEdmModelBuilder edmModelBuilder = null, IUnityContainer container = null) + /// + /// Initializes a new instance of the class. + /// + /// Metadata-container for building EDM model + /// A set of parameters that determine how the export works. + /// During the correction, DI were moved to a separate class. + /// Entity for building an EDM model. sharpened to work with . + public DataObjectEdmModel( + DataObjectEdmMetadata metadata, + DataObjectEdmModelDependencies dependencies = null, + IDataObjectEdmModelBuilder edmModelBuilder = null) { EdmModelBuilder = edmModelBuilder; - if (container != null) - { - if (container.IsRegistered("Export")) - { - ExportService = container.Resolve("Export"); - } - - if (container.IsRegistered()) - { - ExportService = container.Resolve(); - } - - if (container.IsRegistered("ExportStringedObjectView")) - { - ExportStringedObjectViewService = container.Resolve("ExportStringedObjectView"); - } - - if (container.IsRegistered()) - { - ExportStringedObjectViewService = container.Resolve(); - } - - if (container.IsRegistered("Export")) - { - ODataExportService = container.Resolve("Export"); - } - if (container.IsRegistered()) - { - ODataExportService = container.Resolve(); - } + if (dependencies != null) + { + ExportService = dependencies.ExportService ?? dependencies.ExportServiceNamed; + ExportStringedObjectViewService = dependencies.ExportStringedObjectViewService ?? dependencies.ExportStringedObjectViewServiceNamed; + ODataExportService = dependencies.ODataExportService ?? dependencies.ODataExportServiceNamed; } _metadata = metadata ?? throw new ArgumentNullException(nameof(metadata), "Contract assertion not met: metadata != null"); diff --git a/NewPlatform.Flexberry.ORM.ODataService/Model/DataObjectEdmModelDependencies.cs b/NewPlatform.Flexberry.ORM.ODataService/Model/DataObjectEdmModelDependencies.cs new file mode 100644 index 00000000..e737601a --- /dev/null +++ b/NewPlatform.Flexberry.ORM.ODataService/Model/DataObjectEdmModelDependencies.cs @@ -0,0 +1,67 @@ +namespace NewPlatform.Flexberry.ORM.ODataService.Model +{ + using System; + using ICSSoft.STORMNET.Business; + + /// + /// Designed to pass the interface to the , + /// which doesn't support named entities, but allows third-party DI in the future. + /// + public class DataObjectEdmModelDependencies + { + /// + /// An unnamed entity of data export service from ORM. + /// + public IExportService ExportService { get; private set; } + + /// + /// Named entity of data export service from ORM. + /// + public IExportService ExportServiceNamed { get; private set; } + + /// + /// An unnamed entity of data export service with . + /// + public IExportStringedObjectViewService ExportStringedObjectViewService { get; private set; } + + /// + /// Named entity of data export service with . + /// + public IExportStringedObjectViewService ExportStringedObjectViewServiceNamed { get; private set; } + + /// + /// An unnamed entity of data export service from ODataService. + /// + public IODataExportService ODataExportService { get; private set; } + + /// + /// Named entity of data export service from ODataService. + /// + public IODataExportService ODataExportServiceNamed { get; private set; } + + /// + /// Initializes a new instance of the class. + /// + /// An unnamed entity of data export service from ORM. + /// Named entity of data export service from ORM. + /// An unnamed entity of data export service with . + /// Named entity of data export service with . + /// An unnamed entity of data export service from ODataService. + /// Named entity of data export service from ODataService. + public DataObjectEdmModelDependencies( + IExportService exportService, + IExportService exportServiceNamed, + IExportStringedObjectViewService exportStringedObjectViewService, + IExportStringedObjectViewService exportStringedObjectViewServiceNamed, + IODataExportService oDataExportService, + IODataExportService oDataExportServiceNamed) + { + ExportService = exportService; + ExportServiceNamed = exportServiceNamed; + ExportStringedObjectViewService = exportStringedObjectViewService; + ExportStringedObjectViewServiceNamed = exportStringedObjectViewServiceNamed; + ODataExportService = oDataExportService; + ODataExportServiceNamed = oDataExportServiceNamed; + } + } +} diff --git a/NewPlatform.Flexberry.ORM.ODataService/Model/DefaultDataObjectEdmModelBuilder.cs b/NewPlatform.Flexberry.ORM.ODataService/Model/DefaultDataObjectEdmModelBuilder.cs index 59f71748..d48ae351 100644 --- a/NewPlatform.Flexberry.ORM.ODataService/Model/DefaultDataObjectEdmModelBuilder.cs +++ b/NewPlatform.Flexberry.ORM.ODataService/Model/DefaultDataObjectEdmModelBuilder.cs @@ -34,9 +34,9 @@ public class DefaultDataObjectEdmModelBuilder : IDataObjectEdmModelBuilder private readonly PseudoDetailDefinitions _pseudoDetailDefinitions; /// - /// Service provider for resolving DataObjectEdmModel. + /// Container for dependency injection. /// - private readonly IUnityContainer _container; + private IServiceProvider _serviceProvider; /// /// Additional mapping of CLR type to edm primitive type. When it's required on the application side. @@ -87,13 +87,13 @@ public class DefaultDataObjectEdmModelBuilder : IDataObjectEdmModelBuilder /// Additional mapping of CLR type to edm primitive type. public DefaultDataObjectEdmModelBuilder( IEnumerable searchAssemblies, - IUnityContainer container = null, + IServiceProvider serviceProvider, bool useNamespaceInEntitySetName = true, PseudoDetailDefinitions pseudoDetailDefinitions = null, Dictionary additionalMapping = null) { _searchAssemblies = searchAssemblies ?? throw new ArgumentNullException(nameof(searchAssemblies), "Contract assertion not met: searchAssemblies != null"); - _container = container; + _serviceProvider = serviceProvider ?? throw new ArgumentNullException(nameof(serviceProvider)); _useNamespaceInEntitySetName = useNamespaceInEntitySetName; _pseudoDetailDefinitions = pseudoDetailDefinitions ?? new PseudoDetailDefinitions(); @@ -152,7 +152,10 @@ public DataObjectEdmModel Build() } } - return new DataObjectEdmModel(meta, this, _container); + object fromProvider = _serviceProvider.GetService(typeof(DataObjectEdmModelDependencies)); + var dataObjectEdmModel = new DataObjectEdmModel(meta, (DataObjectEdmModelDependencies)fromProvider, this); + + return dataObjectEdmModel; } /// diff --git a/Tests/NewPlatform.Flexberry.ORM.ODataService.Tests/Model/DefaultDataObjectModelBuilderTest.cs b/Tests/NewPlatform.Flexberry.ORM.ODataService.Tests/Model/DefaultDataObjectModelBuilderTest.cs index a716db52..b90bc960 100644 --- a/Tests/NewPlatform.Flexberry.ORM.ODataService.Tests/Model/DefaultDataObjectModelBuilderTest.cs +++ b/Tests/NewPlatform.Flexberry.ORM.ODataService.Tests/Model/DefaultDataObjectModelBuilderTest.cs @@ -1,12 +1,12 @@ namespace NewPlatform.Flexberry.ORM.ODataService.Tests.Model { + using System; + using ICSSoft.Services; using ICSSoft.STORMNET; - - using Xunit; - using NewPlatform.Flexberry.ORM.ODataService.Model; + using Unity; + using Xunit; - public class DefaultDataObjectModelBuilderTest { private class H1 : DataObject @@ -28,7 +28,10 @@ public void TestDataObjectIsNotRegisteredInEmptyModel() [Fact] public void TestRegisteringHierarchy() { - var builder = new DefaultDataObjectEdmModelBuilder(new[] { GetType().Assembly }); + IUnityContainer unityContainer = new UnityContainer(); + IServiceProvider serviceProvider = new UnityServiceProvider(unityContainer); + + var builder = new DefaultDataObjectEdmModelBuilder(new[] { GetType().Assembly }, serviceProvider); DataObjectEdmModel model = builder.Build(); diff --git a/Tests/NewPlatform.Flexberry.ORM.ODataService.Tests/Startup.cs b/Tests/NewPlatform.Flexberry.ORM.ODataService.Tests/Startup.cs index 970a2073..05f72718 100644 --- a/Tests/NewPlatform.Flexberry.ORM.ODataService.Tests/Startup.cs +++ b/Tests/NewPlatform.Flexberry.ORM.ODataService.Tests/Startup.cs @@ -18,6 +18,7 @@ namespace ODataServiceSample.AspNetCore using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Moq; + using NewPlatform.Flexberry; using NewPlatform.Flexberry.ORM.ODataService.Extensions; using NewPlatform.Flexberry.ORM.ODataService.Files; using NewPlatform.Flexberry.ORM.ODataService.Model; @@ -26,8 +27,8 @@ namespace ODataServiceSample.AspNetCore using NewPlatform.Flexberry.ORM.ODataServiceCore.Common.Exceptions; using NewPlatform.Flexberry.ORM.ODataServiceCore.Extensions; using NewPlatform.Flexberry.Services; - using Unity; - + using Unity; + using Unity.Injection; using LockService = NewPlatform.Flexberry.Services.LockService; public class Startup @@ -43,7 +44,7 @@ public Startup(IConfiguration configuration) public IConfiguration Configuration { get; } - protected IUnityContainer _unityContainer; + protected IServiceProvider _serviceProvider; public string CustomizationString => ""; @@ -66,17 +67,26 @@ public virtual void ConfigureServices(IServiceCollection services) */ // Configure Flexberry services via Unity. - IUnityContainer unityContainer = UnityFactory.GetContainer(); + IUnityContainer unityContainer = new UnityContainer(); + IServiceProvider serviceProvider = new UnityServiceProvider(unityContainer); var securityManager = new EmptySecurityManager(); Mock mockAuditService = new Mock(); Mock mockBusinessServerProvider = new Mock(); - IDataService dataService = new PostgresDataService(securityManager, mockAuditService.Object, mockBusinessServerProvider.Object) { CustomizationString = CustomizationString }; - + IDataService dataService = new PostgresDataService(securityManager, mockAuditService.Object, mockBusinessServerProvider.Object) { CustomizationString = CustomizationString }; + + unityContainer.RegisterType( + new InjectionConstructor( + new ResolvedParameter(), + new ResolvedParameter("Export"), + new ResolvedParameter(), + new ResolvedParameter("ExportStringedObjectView"), + new ResolvedParameter(), + new ResolvedParameter("Export"))); unityContainer.RegisterInstance(dataService); unityContainer.RegisterInstance(new LockService(dataService)); unityContainer.RegisterInstance(new EmptySecurityManager()); - _unityContainer = unityContainer; + _serviceProvider = serviceProvider; services.AddMvcCore(options => { @@ -116,8 +126,8 @@ public virtual void Configure(IApplicationBuilder app, IHostingEnvironment env) { builder.MapRoute("Lock", "api/lock/{action}/{dataObjectId}", new { controller = "Lock" }); builder.MapFileRoute(); - }); - + }); + app.UseODataService(builder => { var assemblies = new[] @@ -127,7 +137,7 @@ public virtual void Configure(IApplicationBuilder app, IHostingEnvironment env) typeof(UserSetting).Assembly, typeof(Lock).Assembly, }; - var modelBuilder = new DefaultDataObjectEdmModelBuilder(assemblies, _unityContainer, false); + var modelBuilder = new DefaultDataObjectEdmModelBuilder(assemblies, _serviceProvider, false); var token = builder.MapDataObjectRoute(modelBuilder); }); diff --git a/Tests/NewPlatform.Flexberry.ORM.ODataService.Tests/TestStartup.cs b/Tests/NewPlatform.Flexberry.ORM.ODataService.Tests/TestStartup.cs index 3d8f987a..c1bc1cf1 100644 --- a/Tests/NewPlatform.Flexberry.ORM.ODataService.Tests/TestStartup.cs +++ b/Tests/NewPlatform.Flexberry.ORM.ODataService.Tests/TestStartup.cs @@ -56,7 +56,7 @@ public override void Configure(IApplicationBuilder app, IHostingEnvironment env) }; PseudoDetailDefinitions pseudoDetailDefinitions = (PseudoDetailDefinitions)container.Resolve(typeof(PseudoDetailDefinitions)); - var modelBuilder = new DefaultDataObjectEdmModelBuilder(assemblies, _unityContainer, false, pseudoDetailDefinitions); + var modelBuilder = new DefaultDataObjectEdmModelBuilder(assemblies, _serviceProvider, false, pseudoDetailDefinitions); var token = builder.MapDataObjectRoute(modelBuilder);