繁体   English   中英

如何将事件侦听器添加到使用依赖注入实例化的 object?

[英]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 可能成为强制依赖项,具体取决于其生命周期 scope。

由于目标 class 的性质基于其当前设计尚不清楚,因此不确定如何使用目标。

但是,我建议将设计更改为使用调解器模式,并将任何通知传递给调解器,调解器可以将其路由到任何订阅的处理程序。 这更接近于单一职责原则和关注点分离。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM