title: Throw event thru classes
body: <p>I have long process and sometimes I want to return process status.
  I have the following code:</p>
  <pre><code>public delegate Task DeviceOnSureMdmResetIMEIHandler(TabletWithoutDeviceIdDto sureMdmTablet, string oldIMEI);
  public delegate Task LocalTabletGroupIsNotFoundHandler(TabletWithoutDeviceIdDto sureMdmTablet);
  public delegate Task ExistingDeviceIsNotTabletHandler(Device device);
  public delegate Task ErrorCombiningDevicesHandler(string result);
  
  public interface ISureMdmTabletService
  {
      List&lt;TabletWithoutDeviceIdDto&gt; Tablets { get; set; }
  
      event DeviceOnSureMdmResetIMEIHandler DeviceOnSureMdmResetIMEIEvent;
      event LocalTabletGroupIsNotFoundHandler LocalTabletGroupIsNotFoundEvent;
      event ExistingDeviceIsNotTabletHandler ExistingDeviceIsNotTabletEvent;
      event ErrorCombiningDevicesHandler ErrorCombiningDevicesEvent;
  
      List&lt;string&gt; DeviceIsChanged(TabletWithoutDeviceIdDto newItem, Device dbDevice);
      string ImeiIsChanged(TabletWithoutDeviceIdDto newItem, Tablet dbTablet);
      List&lt;string&gt; TabletIsChanged(TabletWithoutDeviceIdDto newItem, Tablet dbTablet);
      bool ShouldPhoneNumberBeUpdated(TabletWithoutDeviceIdDto newItem, Device device);
      bool ShouldICCIDBeUpdated(TabletWithoutDeviceIdDto newItem, Device device);
      bool ShouldIMSIBeUpdated(TabletWithoutDeviceIdDto newItem, Device device);
  
      void UpdateAlreadyExistingTablets();
      void AddNewTablets();
      void DeletedTablets();
      Task DuplicateImeiRecordsAsync();
  
      Task&lt;UpdateTabletsFromSureMdmResultDto&gt; UpdateTabletsSaveChangesAsync();
  }
  
  
  public class SureMdmTabletService : ISureMdmTabletService
  {
      public event DeviceOnSureMdmResetIMEIHandler DeviceOnSureMdmResetIMEIEvent;
      public event LocalTabletGroupIsNotFoundHandler LocalTabletGroupIsNotFoundEvent;
      public event ExistingDeviceIsNotTabletHandler ExistingDeviceIsNotTabletEvent;
      public event ErrorCombiningDevicesHandler ErrorCombiningDevicesEvent;
  
      private List&lt;TabletWithoutDeviceIdDto&gt; _tablets;
      public List&lt;TabletWithoutDeviceIdDto&gt; Tablets
      {
          get
          {
              return _tablets;
          }
          set
          {
              _tablets = value;
          }
      }
      private List&lt;string&gt; _tabletsIMEI { get; set; }
      private List&lt;string&gt; _tabletsIds { get; set; }
  
      private List&lt;Tablet&gt; _alreadyExistsTablets { get; set; }
      private List&lt;Tablet&gt; _allTablets { get; set; }
  
  
      private readonly ICombine2DevicesIntoOneService _combine2DevicesIntoOneService;
      private readonly DataContext _dbContext;
      private readonly IMapper _mapper;
      private DeviceModel _deviceModel;
  
      public SureMdmTabletService(DataContext dbContext, ICombine2DevicesIntoOneService combine2DevicesIntoOneService)
      {
            // .....
      }
  
      public List&lt;string&gt; DeviceIsChanged(TabletWithoutDeviceIdDto newItem, Device dbDevice)
      {
            // .....
      }
  
      public string ImeiIsChanged(TabletWithoutDeviceIdDto newItem, Tablet dbTablet)
      {
            // .....
      }
  
      public List&lt;string&gt; TabletIsChanged(TabletWithoutDeviceIdDto newItem, Tablet dbTablet)
      {
            // .....
      }
  
      // .....
  
  
      public void UpdateAlreadyExistingTablets()
      {
           **DeviceOnSureMdmResetIMEIEvent.Invoke(...);**
      }
  }
  </code></pre>
  <p>and wrapper about it:</p>
  <pre><code>public interface ISureMdmTabletUpdateCommandService
  {
      Task&lt;UpdateTabletsFromSureMdmResultDto&gt; CommandAsync(List&lt;TabletWithoutDeviceIdDto&gt; tablets);
  }
  
  public class SureMdmTabletUpdateCommandService : ISureMdmTabletUpdateCommandService
  {
      private readonly ISureMdmTabletService _sureMdmTabletService;
  
      public SureMdmTabletUpdateCommandService(ISureMdmTabletService sureMdmTabletService)
      {
          _sureMdmTabletService = sureMdmTabletService;
      }
  
      public async Task&lt;UpdateTabletsFromSureMdmResultDto&gt; CommandAsync(List&lt;TabletWithoutDeviceIdDto&gt; tablets)
      {
          _sureMdmTabletService.Tablets = tablets;
          _sureMdmTabletService.UpdateAlreadyExistingTablets();
  
          _sureMdmTabletService.AddNewTablets();
  
          _sureMdmTabletService.DeletedTablets();
  
          await _sureMdmTabletService.DuplicateImeiRecordsAsync();
  
          return await _sureMdmTabletService.UpdateTabletsSaveChangesAsync();
      }
  }
  </code></pre>
  <p>this wrapper is used by client app:</p>
  <pre><code>                var resultTablets = await _sureMdmTabletUpdateCommandService.CommandAsync(tablets);
  </code></pre>
  <p>I want to subscribe on events from client app like this:</p>
  <pre><code>_sureMdmTabletUpdateCommandService.DeviceOnSureMdmResetIMEIEvent += 
  </code></pre>
  <p>but ISureMdmTabletUpdateCommandService does not have, nested class has it. How to throw these events carefully and without dummy intermediate events inside ISureMdmTabletUpdateCommandService  ?</p>