Я использую Entity Framework Core для создания сервисов crud в моем asp. net основном приложении. В моих сервисах crud есть события и обработчики, такие как OnCreated, OnUpdated.
Эти события должны иметь возможность вызывать и другие сервисы crud.
Как этого можно достичь?
Вот как я внедряю свои службы CRUD:
services.AddTransient<IRoleManager, RoleManager>();
services.AddTransient<IOfficeManager, OfficeManager>();
services.AddTransient<IProjectManager, ProjectManager>();
Вот пример моей CRUD-службы:
public class ProjectManager : IProjectManager
{
protected AppDbContext Db;
public ProjectManager(AppDbContext db)
{
Db = db;
}
public IQueryable<Project> GetProjects()
{
return Db.Projects;
}
public Project CreateProject (Project project)
{
Project Project = Db.Projects.Add(project).Entity;
Db.SaveChanges();
OnProjectCreated(Project);
return Project;
}
public Project UpdateProject (Project project)
{
Project Project = Db.Projects.Update(project).Entity;
Db.SaveChanges();
OnProjectUpdated(Project);
return Project;
}
public Project DeleteProject (Project project)
{
Db.Projects.Remove(project);
Db.SaveChanges();
OnProjectDeleted(project);
return project;
}
public event EventHandler<ProjectManagerEventArgs> ProjectCreated;
public event EventHandler<ProjectManagerEventArgs> ProjectUpdated;
public event EventHandler<ProjectManagerEventArgs> ProjectDeleted;
protected virtual void OnProjectCreated(Project project)
{
ProjectCreated?.Invoke(this, new ProjectManagerEventArgs(project));
}
protected virtual void OnProjectUpdated(Project project)
{
ProjectUpdated?.Invoke(this, new ProjectManagerEventArgs(project));
}
protected virtual void OnProjectDeleted(Project project)
{
ProjectDeleted?.Invoke(this, new ProjectManagerEventArgs(project));
}
}
Я могу подписаться таким образом ...
services.AddTransient(sp =>
{
AppDbContext dependency = sp.GetService<AppDbContext>();
ProjectManager target = new ProjectManager(dependency);
target.ProjectCreated += new ProjectManagerListener().OnProjectCreated;
return (IProjectManager)target;
});
, но этот способ кажется очень небрежным и не позволяет моему обработчику / слушателю получить доступ к другим службам CRUD.
Как я могу использовать события с DI?
КОД ДЛЯ СЛУШАТЕЛЯ
public class ProjectManagerListener
{
private readonly IClaimManager ClaimManager;
private readonly IRoleManager RoleManager;
public ProjectManagerListener(IClaimManager claimManager, IRoleManager roleManager)
{
ClaimManager = claimManager;
RoleManager = roleManager;
}
public void OnProjectCreated(object source, ProjectManagerEventArgs ProjectEventArgs)
{
foreach (Role role in RoleManager.GetRoles())
{
ClaimManager.CreateClaim(new ProjectRoleClaim() { ProjectId = ProjectEventArgs.Project.Id, RoleId = role.Id });
}
}
}
КОД ДЛЯ ВПРЫСКА СЛУШАТЕЛЯ
services.AddTransient(sp =>
{
AppDbContext dependency = sp.GetService<AppDbContext>();
IClaimManager ClaimManager = sp.GetService<IClaimManager>();
IRoleManager RoleManager = sp.GetService<IRoleManager>();
ProjectManager target = new ProjectManager(dependency);
target.ProjectCreated += new ProjectManagerListener(ClaimManager, RoleManager).OnProjectCreated;
return (IProjectManager)target;
});