首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过类抛出事件

通过类抛出事件
EN

Stack Overflow用户
提问于 2022-01-20 10:49:47
回答 1查看 41关注 0票数 1

我有很长的进程,有时我想返回进程状态。我有以下代码:

代码语言:javascript
复制
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<TabletWithoutDeviceIdDto> Tablets { get; set; }

    event DeviceOnSureMdmResetIMEIHandler DeviceOnSureMdmResetIMEIEvent;
    event LocalTabletGroupIsNotFoundHandler LocalTabletGroupIsNotFoundEvent;
    event ExistingDeviceIsNotTabletHandler ExistingDeviceIsNotTabletEvent;
    event ErrorCombiningDevicesHandler ErrorCombiningDevicesEvent;

    List<string> DeviceIsChanged(TabletWithoutDeviceIdDto newItem, Device dbDevice);
    string ImeiIsChanged(TabletWithoutDeviceIdDto newItem, Tablet dbTablet);
    List<string> 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<UpdateTabletsFromSureMdmResultDto> UpdateTabletsSaveChangesAsync();
}


public class SureMdmTabletService : ISureMdmTabletService
{
    public event DeviceOnSureMdmResetIMEIHandler DeviceOnSureMdmResetIMEIEvent;
    public event LocalTabletGroupIsNotFoundHandler LocalTabletGroupIsNotFoundEvent;
    public event ExistingDeviceIsNotTabletHandler ExistingDeviceIsNotTabletEvent;
    public event ErrorCombiningDevicesHandler ErrorCombiningDevicesEvent;

    private List<TabletWithoutDeviceIdDto> _tablets;
    public List<TabletWithoutDeviceIdDto> Tablets
    {
        get
        {
            return _tablets;
        }
        set
        {
            _tablets = value;
        }
    }
    private List<string> _tabletsIMEI { get; set; }
    private List<string> _tabletsIds { get; set; }

    private List<Tablet> _alreadyExistsTablets { get; set; }
    private List<Tablet> _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<string> DeviceIsChanged(TabletWithoutDeviceIdDto newItem, Device dbDevice)
    {
          // .....
    }

    public string ImeiIsChanged(TabletWithoutDeviceIdDto newItem, Tablet dbTablet)
    {
          // .....
    }

    public List<string> TabletIsChanged(TabletWithoutDeviceIdDto newItem, Tablet dbTablet)
    {
          // .....
    }

    // .....


    public void UpdateAlreadyExistingTablets()
    {
         **DeviceOnSureMdmResetIMEIEvent.Invoke(...);**
    }
}

以及包装:

代码语言:javascript
复制
public interface ISureMdmTabletUpdateCommandService
{
    Task<UpdateTabletsFromSureMdmResultDto> CommandAsync(List<TabletWithoutDeviceIdDto> tablets);
}

public class SureMdmTabletUpdateCommandService : ISureMdmTabletUpdateCommandService
{
    private readonly ISureMdmTabletService _sureMdmTabletService;

    public SureMdmTabletUpdateCommandService(ISureMdmTabletService sureMdmTabletService)
    {
        _sureMdmTabletService = sureMdmTabletService;
    }

    public async Task<UpdateTabletsFromSureMdmResultDto> CommandAsync(List<TabletWithoutDeviceIdDto> tablets)
    {
        _sureMdmTabletService.Tablets = tablets;
        _sureMdmTabletService.UpdateAlreadyExistingTablets();

        _sureMdmTabletService.AddNewTablets();

        _sureMdmTabletService.DeletedTablets();

        await _sureMdmTabletService.DuplicateImeiRecordsAsync();

        return await _sureMdmTabletService.UpdateTabletsSaveChangesAsync();
    }
}

客户端应用程序使用此包装程序:

代码语言:javascript
复制
                var resultTablets = await _sureMdmTabletUpdateCommandService.CommandAsync(tablets);

我想订阅像这样的客户端应用程序的事件:

代码语言:javascript
复制
_sureMdmTabletUpdateCommandService.DeviceOnSureMdmResetIMEIEvent += 

但是ISureMdmTabletUpdateCommandService没有,嵌套类有它。如何在ISureMdmTabletUpdateCommandService中小心抛出这些事件而不使用虚拟中间事件?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-20 13:29:09

包装器要求您拥有它上的所有基础设施,并且不需要有完整的事件,只需要附加和分离一个中间方法,这样就可以执行显式的事件实现:

代码语言:javascript
复制
object objectLock = new Object();

event DeviceOnSureMdmResetIMEIHandler DeviceOnSureMdmResetIMEIEvent
    {
        add
        {
            lock (objectLock)
            {
                _sureMdmTabletService.DeviceOnSureMdmResetIMEIEvent += value;
            }
        }
        remove
        {
            lock (objectLock)
            {
                _sureMdmTabletService.DeviceOnSureMdmResetIMEIEvent -= value;
            }
        }
    } 

锁是必需的,因为+=和-=操作不是原子操作,而是读、修改、写。

有了这样的悲哀,我建议根本不使用事件。我只是作为一个参数传递一个Action<TabletWithoutDeviceIdDto, string>,甚至不声明它的自定义委托。它只是简单的方法,如果您使用Func<TabletWithoutDeviceIdDto, string, Task>而不是事件,它可以支持异步操作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70784841

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档