Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Register for DefaultDataObjectEdmModelBuilder #283

Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 9 additions & 31 deletions NewPlatform.Flexberry.ORM.ODataService/Model/DataObjectEdmModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -85,40 +85,18 @@ public class DataObjectEdmModel : EdmModel
private readonly IDictionary<Type, EdmEntitySet> _registeredEntitySets = new Dictionary<Type, EdmEntitySet>();
private readonly IDictionary<Type, IList<Type>> _typeHierarchy = new Dictionary<Type, IList<Type>>();

public DataObjectEdmModel(DataObjectEdmMetadata metadata, IDataObjectEdmModelBuilder edmModelBuilder = null, IUnityContainer container = null)
public DataObjectEdmModel(
DataObjectEdmMetadata metadata,
DataObjectEdmModelDependencies dependencies = null,
IDataObjectEdmModelBuilder edmModelBuilder = null)
{
EdmModelBuilder = edmModelBuilder;
if (container != null)
{
if (container.IsRegistered<IExportService>("Export"))
{
ExportService = container.Resolve<IExportService>("Export");
}

if (container.IsRegistered<IExportService>())
{
ExportService = container.Resolve<IExportService>();
}

if (container.IsRegistered<IExportStringedObjectViewService>("ExportStringedObjectView"))
{
ExportStringedObjectViewService = container.Resolve<IExportStringedObjectViewService>("ExportStringedObjectView");
}

if (container.IsRegistered<IExportStringedObjectViewService>())
{
ExportStringedObjectViewService = container.Resolve<IExportStringedObjectViewService>();
}

if (container.IsRegistered<IODataExportService>("Export"))
{
ODataExportService = container.Resolve<IODataExportService>("Export");
}

if (container.IsRegistered<IODataExportService>())
{
ODataExportService = container.Resolve<IODataExportService>();
}
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");
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
namespace NewPlatform.Flexberry.ORM.ODataService.Model
{
public class DataObjectEdmModelDependencies
{
public IExportService ExportService;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

для корректности вероятно у свойств должно быть public get и private set.

public IExportService ExportServiceNamed;
public IExportStringedObjectViewService ExportStringedObjectViewService;
public IExportStringedObjectViewService ExportStringedObjectViewServiceNamed;
public IODataExportService ODataExportService;
public IODataExportService ODataExportServiceNamed;

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;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,9 @@ public class DefaultDataObjectEdmModelBuilder : IDataObjectEdmModelBuilder
private readonly PseudoDetailDefinitions _pseudoDetailDefinitions;

/// <summary>
/// Service provider for resolving DataObjectEdmModel.
/// Container for dependency injection.
/// </summary>
private readonly IUnityContainer _container;
private IServiceProvider _serviceProvider;

/// <summary>
/// Additional mapping of CLR type to edm primitive type. When it's required on the application side.
Expand Down Expand Up @@ -87,13 +87,13 @@ public class DefaultDataObjectEdmModelBuilder : IDataObjectEdmModelBuilder
/// <param name="additionalMapping">Additional mapping of CLR type to edm primitive type.</param>
public DefaultDataObjectEdmModelBuilder(
IEnumerable<Assembly> searchAssemblies,
IUnityContainer container = null,
IServiceProvider serviceProvider,
bool useNamespaceInEntitySetName = true,
PseudoDetailDefinitions pseudoDetailDefinitions = null,
Dictionary<Type, IEdmPrimitiveType> 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();

Expand Down Expand Up @@ -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;
}

/// <summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ public void TestDataObjectIsNotRegisteredInEmptyModel()
[Fact]
public void TestRegisteringHierarchy()
{
var builder = new DefaultDataObjectEdmModelBuilder(new[] { GetType().Assembly });
var builder = new DefaultDataObjectEdmModelBuilder(new[] { GetType().Assembly }, null);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

И будет ArgumentNullException(nameof(serviceProvider)).
Вероятно, нужно сервис провайдер тестовый создать и его тут передавать.


DataObjectEdmModel model = builder.Build();

Expand Down
14 changes: 8 additions & 6 deletions Tests/NewPlatform.Flexberry.ORM.ODataService.Tests/Startup.cs
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ public Startup(IConfiguration configuration)

public IConfiguration Configuration { get; }

protected IUnityContainer _unityContainer;
protected IServiceProvider _serviceProvider;

public string CustomizationString => "";

Expand All @@ -66,17 +66,19 @@ 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<IAuditService> mockAuditService = new Mock<IAuditService>();
Mock<IBusinessServerProvider> mockBusinessServerProvider = new Mock<IBusinessServerProvider>();
IDataService dataService = new PostgresDataService(securityManager, mockAuditService.Object, mockBusinessServerProvider.Object) { CustomizationString = CustomizationString };

unityContainer.RegisterType<DataObjectEdmModelDependencies>();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Нам нужна не просто сущность класса DataObjectEdmModelDependencies. Если сделать так, то параметры просто разрешатся дефолтными для соответствующих интерфейсов.

IExportService exportService,
IExportService exportServiceNamed,
IExportStringedObjectViewService exportStringedObjectViewService,
IExportStringedObjectViewService exportStringedObjectViewServiceNamed,
IODataExportService oDataExportService,
IODataExportService oDataExportServiceNamed

Нам нужна регистрация по типу
"container.RegisterType(new InjectionConstructor(container.Resolve("emptyUser")));", причём нужен синглтон (не помню, вроде тут ещё параметр нужно указать).

unityContainer.RegisterInstance(dataService);
unityContainer.RegisterInstance<ILockService>(new LockService(dataService));
unityContainer.RegisterInstance<ISecurityManager>(new EmptySecurityManager());

_unityContainer = unityContainer;
_serviceProvider = serviceProvider;

services.AddMvcCore(options =>
{
Expand Down Expand Up @@ -116,8 +118,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[]
Expand All @@ -127,7 +129,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);
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down