add support for Dynamic Entity Registration in DbContext by Provides IXEntityRegisterar interface and XBaseEntityRegisterar as an abstract Implementation ...
all other requirements handled inside Module.
This commit is contained in:
@@ -0,0 +1,56 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using xDataService.Interfaces;
|
||||
using xModels.Base;
|
||||
|
||||
namespace xDataService.Providers
|
||||
{
|
||||
/// <summary>
|
||||
/// Base Entity Registerar ...
|
||||
/// </summary>
|
||||
public abstract class XBaseEntityRegisterar : IXEntityRegisterar
|
||||
{
|
||||
/// <summary>
|
||||
/// Private Entity Types Collection ...
|
||||
/// </summary>
|
||||
private readonly List<Type> entityTypes = [];
|
||||
|
||||
/// <summary>
|
||||
/// Name ...
|
||||
/// </summary>
|
||||
public string Name { get; }
|
||||
|
||||
protected XBaseEntityRegisterar(string name)
|
||||
{
|
||||
Name = name;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Add Specified Entity to Collection ...
|
||||
/// </summary>
|
||||
/// <typeparam name="TEntity"></typeparam>
|
||||
/// <typeparam name="TKey"></typeparam>
|
||||
public void AddEntity<TEntity, TKey>()
|
||||
where TEntity : XBaseEntity<TKey>
|
||||
{
|
||||
entityTypes.Add(typeof(TEntity));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Retrieve Registered Entity Types ...
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public IEnumerable<Type> GetEntityTypes()
|
||||
{
|
||||
return entityTypes;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Configure Dynamic Entities ...
|
||||
/// </summary>
|
||||
/// <param name="modelBuilder"></param>
|
||||
public virtual void ConfigureEntities(ModelBuilder modelBuilder)
|
||||
{ }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,121 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using xCommons.Extensions;
|
||||
using xDataService.Interfaces;
|
||||
|
||||
namespace xDataService.Providers
|
||||
{
|
||||
public class XEntityRegisterarHandlerService
|
||||
{
|
||||
/// <summary>
|
||||
/// a Collection for Extract Registerars Services ...
|
||||
/// </summary>
|
||||
private readonly List<IXEntityRegisterar> registerars = [];
|
||||
|
||||
/// <summary>
|
||||
/// a Collection for Holding all Entity Types ...
|
||||
/// </summary>
|
||||
public IReadOnlyList<Type> AllEntityTypes { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// Retrieve Specified Registerars Entity Types ...
|
||||
/// </summary>
|
||||
/// <param name="names"></param>
|
||||
/// <returns></returns>
|
||||
public IReadOnlyList<Type> GetEntityTypes(string[] names = null)
|
||||
{
|
||||
//
|
||||
var items = new List<Type>();
|
||||
|
||||
//
|
||||
if (!names.IsNull() && names.HasChild())
|
||||
{
|
||||
//
|
||||
items = [.. registerars
|
||||
.Where(r => names.Contains(r.Name))
|
||||
.SelectMany(r => r.GetEntityTypes())];
|
||||
}
|
||||
|
||||
//
|
||||
return items.AsReadOnly();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Load all Dynamically Registered Entities ...
|
||||
/// </summary>
|
||||
/// <param name="path"></param>
|
||||
public void HandleRegisteredEntities()
|
||||
{
|
||||
//
|
||||
var entityTypes = new List<Type>();
|
||||
// path = Path.Combine (Directory.GetCurrentDirectory ());
|
||||
var path = Path.Combine (AppContext.BaseDirectory);
|
||||
var files = Directory.GetFiles(path, "*.dll");
|
||||
foreach (var dll in files)
|
||||
{
|
||||
//
|
||||
// Retrieve DLL Assembly ...
|
||||
var assembly = Assembly.LoadFrom(dll);
|
||||
|
||||
//
|
||||
// Extract Registerar Types ...
|
||||
var registerarTypes = assembly
|
||||
.GetExportedTypes()
|
||||
.Where(t =>
|
||||
!t.IsAbstract &&
|
||||
typeof(IXEntityRegisterar).IsAssignableFrom(t));
|
||||
foreach (var registerarType in registerarTypes)
|
||||
{
|
||||
//
|
||||
// Create Instance of Registerar Type ...
|
||||
var registerar = (IXEntityRegisterar)Activator.CreateInstance(registerarType);
|
||||
if (!registerar.IsNull())
|
||||
{
|
||||
//
|
||||
// Add Registerar Instance to Collection ...
|
||||
registerars.Add(registerar);
|
||||
|
||||
//
|
||||
// Add Registerar Provided Entities to Collection ...
|
||||
entityTypes.AddRange(registerar.GetEntityTypes());
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Converts to Readonly List ...
|
||||
AllEntityTypes = entityTypes.AsReadOnly();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Configure all Dynamically Registered Entities ...
|
||||
/// </summary>
|
||||
/// <param name="modelBuilder"></param>
|
||||
public void HandleApplyRegisteredEntitiesConfigurations(
|
||||
ModelBuilder modelBuilder,
|
||||
string[] names = null
|
||||
)
|
||||
{
|
||||
//
|
||||
var selectedRegisterars =
|
||||
!names.IsNull() &&
|
||||
names.HasChild()
|
||||
? registerars
|
||||
.Where(r => names.Contains(r.Name))
|
||||
: registerars;
|
||||
|
||||
//
|
||||
// Loop Through Extracted Registerars ...
|
||||
foreach(var registerar in selectedRegisterars)
|
||||
{
|
||||
//
|
||||
// Configure Specified Registerars Entities ...
|
||||
registerar.ConfigureEntities(modelBuilder);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user