簡體   English   中英

在派生類中重寫基類方法並觸發其事件

[英]Override base class methods in derived class and fire its event

我想在派生類中重寫基類方法,然后在派生類中做一些事情。 因此,將使用其泛型類型調用基類方法。 然后,我打算觸發被重寫的派生類方法。

我有以下代碼:

    public class Service<T> : Interface.IService<T> where T : class
    {

    public virtual event System.EventHandler<EntitySavingEventArgs<T>> BeforeSavingRecord;

    public Service()
    {

    }

    public virtual void OnBeforeSavingRecord(object sender, EntitySavingEventArgs<T> e)
    {

    }

    private readonly DbContext _dbContext;
    public Service(DbContext dbContext)
    {
        _dbContext = dbContext;
    }

    public virtual void Create(T item)
    {
        if (item == null)
            throw new ArgumentNullException("item");

        BeforeSavingRecord?.Invoke(this, new EntitySavingEventArgs<T>() { SavedEntity = item });
        _dbContext.Set(typeof(T)).Add(item);
        _dbContext.SaveChanges();
    }
}

在派生類中,我有這樣的東西:

[Service]
public partial class BankBusiness : Service<Bank>, IBankBusiness
{
    public BankBusiness()
        : base(ContainerManager.Container.Resolve<MyContext>())
    {

    }


    public override void OnBeforeSavingRecord(object sender, EntitySavingEventArgs<Bank> e)
    {
        //Do something with entity item before saving
        base.OnBeforeSavingRecord(sender, e);
    }
}

然后當我打電話給我的控制器時

bankBiz.Create(new Bank() { ... });

我想觸發已注冊到BeforeSavingRecord事件的bankBiz(派生類)重寫方法(OnBeforeSavingRecord)。

我不知道我的情況是否正確,是否正確,我如何解雇。

如果不正確,我該怎么辦。

我在基類中實現了類似的模式,就像這樣:

基礎:

public virtual void OnBeforeSavingRecord(object sender, EntitySavingEventArgs<T> e)
{    }

在派生類中,我恰好擁有您使用的調用:

派生:

public override void OnBeforeSavingRecord(object sender, EntitySavingEventArgs<Bank> e)
{
    //Do something with entity item before saving
    base.OnBeforeSavingRecord(sender, e);
}

就我而言,要觸發該事件,只需致電

OnBeforeSavingRecord(this, new EntitySavingEventArgs<T>() { SavedEntity = item });

整個場景對我都有用。

編輯:

如果從派生類的實例調用它,則調用OnBeforeSavingRecord將在派生類的重寫方法中執行代碼!

如果我理解正確,那么您想在Create方法中觸發事件,但希望執行派生類的事件代碼。 就像您的情況一樣,事件將被覆蓋。 您可以使用以下簡單的控制台應用程序對其進行測試:(只需復制粘貼並運行)

public class Service 
{
    public virtual event System.EventHandler<EventArgs> BeforeSavingRecord;

    public virtual void OnBeforeSavingRecord(object sender, EventArgs e)
    {
        Console.WriteLine("Base: OnBeforeSavingRecord method call");
    }

    public virtual void Create(object item)
    {
        Console.WriteLine("Base: Create method call");
        // this will call the method of the derived class! if you call it from an instance of the derived class
        OnBeforeSavingRecord(this, new EventArgs());
    }
}

public partial class BankBusiness : Service
{
    public override void OnBeforeSavingRecord(object sender, EventArgs e)
    {
        //Do something with entity item before saving
        Console.WriteLine("Derived Class OnBeforeSavingRecord CALL");

        base.OnBeforeSavingRecord(sender, e);                
    }
}

static void Main(string[] args)
{        
    BankBusiness bankBiz = new BankBusiness();

    bankBiz.Create(new object());

    Console.ReadKey();
}

@Mong Zhu您的解決方案有效,但不適用於我的情況。 我想出了以下解決方案

public class Service<T> : Interface.IService<T> where T : class
{

    Interface.IService<T> implementation;

    public virtual event System.EventHandler<EntitySavingEventArgs<T>> BeforeSavingRecord;

    public virtual event System.EventHandler<EntitySavingEventArgs<T>> SavingRecord;

    public virtual event System.EventHandler<EntitySavingEventArgs<T>> RecordSaved;

    public void PopulateEvents(Interface.IService<T> _implementation)
    {
        implementation = _implementation;

        implementation.BeforeSavingRecord += new System.EventHandler<EntitySavingEventArgs<T>>(this.OnBeforeSavingRecord);
        implementation.SavingRecord += new System.EventHandler<EntitySavingEventArgs<T>>(this.OnSavingRecord);
        implementation.RecordSaved += new System.EventHandler<EntitySavingEventArgs<T>>(this.OnRecordSaved);
    }

    public virtual void OnBeforeSavingRecord(object sender, EntitySavingEventArgs<T> e)
    {

    }

    public virtual void OnSavingRecord(object sender, EntitySavingEventArgs<T> e)
    {

    }
    public virtual void OnRecordSaved(object sender, EntitySavingEventArgs<T> e)
    {

    }

    private readonly DbContext _dbContext;
    public Service(DbContext dbContext)
    {
        _dbContext = dbContext;
    }

    public virtual void Create(T item)
    {

        if (item == null)
            throw new ArgumentNullException("item");

        BeforeSavingRecord?.Invoke(this, new EntitySavingEventArgs<T>() { SavedEntity = item });
        _dbContext.Set(typeof(T)).Add(item);
        SavingRecord?.Invoke(this, new EntitySavingEventArgs<T>() { SavedEntity = item });
        _dbContext.SaveChanges();
        RecordSaved?.Invoke(this, new EntitySavingEventArgs<T>() { SavedEntity = item });

    }
}

和派生類:

    [Service]
public partial class BankBusiness : Service<Bank>, IBankBusiness
{
    public BankBusiness()
        : base(ContainerManager.Container.Resolve<MyContext>())
    {
        base.PopulateEvents(this);
    }


    public override void OnBeforeSavingRecord(object sender, EntitySavingEventArgs<Bank> e)
    {

        base.OnBeforeSavingRecord(sender, e);
    }
}

重點是

base.PopulateEvents(this);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM