如何将事件侦听器添加到使用依赖注入实例化的对象?
How can I add an event listener to an object that is instantiated with dependency injection?
由于在使用依赖项注入时没有可使用的变量,我该如何向服务添加事件侦听器?
这是项目服务
public class ProjectService
{
protected AppDbContext _db;
public ProjectService(AppDbContext db)
{
_db = db;
}
public IQueryable<Project> GetProjects()
{
return _db.Projects;
}
public Project CreateProject (Project Project)
{
Project project = _db.Projects.Add(Project).Entity;
OnProjectCreated(project);
_db.SaveChanges();
return project;
}
public Project UpdateProject (Project Project)
{
Project project = _db.Projects.Update(Project).Entity;
_db.SaveChanges();
return project;
}
public Project DeleteProject (Project Project)
{
_db.Projects.Remove(Project);
_db.SaveChanges();
return Project;
}
public event EventHandler<ProjectEventArgs> ProjectCreated;
protected virtual void OnProjectCreated(Project project)
{
ProjectCreated?.Invoke(this, new ProjectEventArgs(project));
}
}
这就是我注入它的方式
services.AddTransient<ProjectService>();
可以使用工厂委托。在委托中,目标类型可以使用其依赖项进行初始化,然后订阅事件。
services.AddTransient<ProjectService>(sp => {
AppDbContext dependency = sp.GetService<AppDbContext>();
ProjectService target = new ProjectService(dependency);
target.ProjectCreated += some_event_handler_here;
return target;
});
但是这种方法会产生很多问题。
处理程序最终会在启动时存活下来。
DbContext 可能会变成 captive dependency,具体取决于其生命周期范围。
由于目标 class 的性质根据其当前设计尚不清楚,因此不确定目标的使用方式。
不过,我建议更改设计以使用调解器模式,并将任何通知传递给调解器,调解器可以将其路由到任何订阅的处理程序。这更符合单一职责原则和关注点分离。
由于在使用依赖项注入时没有可使用的变量,我该如何向服务添加事件侦听器?
这是项目服务
public class ProjectService
{
protected AppDbContext _db;
public ProjectService(AppDbContext db)
{
_db = db;
}
public IQueryable<Project> GetProjects()
{
return _db.Projects;
}
public Project CreateProject (Project Project)
{
Project project = _db.Projects.Add(Project).Entity;
OnProjectCreated(project);
_db.SaveChanges();
return project;
}
public Project UpdateProject (Project Project)
{
Project project = _db.Projects.Update(Project).Entity;
_db.SaveChanges();
return project;
}
public Project DeleteProject (Project Project)
{
_db.Projects.Remove(Project);
_db.SaveChanges();
return Project;
}
public event EventHandler<ProjectEventArgs> ProjectCreated;
protected virtual void OnProjectCreated(Project project)
{
ProjectCreated?.Invoke(this, new ProjectEventArgs(project));
}
}
这就是我注入它的方式
services.AddTransient<ProjectService>();
可以使用工厂委托。在委托中,目标类型可以使用其依赖项进行初始化,然后订阅事件。
services.AddTransient<ProjectService>(sp => {
AppDbContext dependency = sp.GetService<AppDbContext>();
ProjectService target = new ProjectService(dependency);
target.ProjectCreated += some_event_handler_here;
return target;
});
但是这种方法会产生很多问题。
处理程序最终会在启动时存活下来。
DbContext 可能会变成 captive dependency,具体取决于其生命周期范围。
由于目标 class 的性质根据其当前设计尚不清楚,因此不确定目标的使用方式。
不过,我建议更改设计以使用调解器模式,并将任何通知传递给调解器,调解器可以将其路由到任何订阅的处理程序。这更符合单一职责原则和关注点分离。