簡體   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