首页 > 解决方案 > 如何正确更改代码以在没有委托的情况下使用

问题描述

有从中间 2 方法执行的方法 UpdateAsync。我想直接执行 UpdateAsync 而不依赖于签名中的委托,以便有机会将这两种行为结合起来。UpdateType 和 UpdateNameAsync 不相似。我怎样才能正确地改变它或摆脱委托以使其成为可能?

public async Task UpdateBaseEntityTypeAsync(Guid id, Guid baseEntityId, IEnumerable<string> type)
{
    await UpdateAsync(id, baseEntityId, async x => x.UpdateType(type));
}

public async Task UpdateBaseEntityNameAsync(Guid id, Guid baseEntityId, string name)
{
    await UpdateAsync(id, baseEntityId,
        async x => await x.UpdateNameAsync(name)).ConfigureAwait(false);
}   

public async Task UpdateAsync(Guid aggregatorId, Guid baseEntityId, Func<BaseEntity, Task> updateAsync)
{
    var someAggregator = await someAggregator.TryFindById(aggregatorId).ConfigureAwait(false);
    
    var baseEntity = someAggregator.ListBaseEntities()
        .FirstOrDefault(x => x.Id == baseEntityId);

    await updateAsync.Invoke(baseEntity).ConfigureAwait(false);

    await aggregatorRepo.Save(someAggregator).ConfigureAwait(false);
}

我做过这样的事情,但我认为它看起来像废话:

public class BaseEntityDTO
{      
    public Guid Id { get; set; }
    public string Name { get; set; }
    public IEnumerable<string> Type { get; set; }
}

public async Task UpdateAsync(Guid aggregatorId, List<BaseEntityDTO> baseEntityDTO)
{
    var someAggregator = await someAggregator.TryFindById(aggregatorId).ConfigureAwait(false);

    foreach (var intent in intentsToEdit)
    {
        var baseEntity = someAggregator.ListBaseEntities()
            .FirstOrDefault(x => x.Id == baseEntityDTO.Id);

        if (baseEntityDTO.Type != null)
        {
            baseEntity.UpdateType(baseEntityDTO.Type);
        }
        if (baseEntityDTO.Name != null)
        {
            await baseEntity.UpdateNameAsync(baseEntityDTO.Name).ConfigureAwait(false);
        }      
        await aggregatorRepo.Save(someAggregator).ConfigureAwait(false);
    }
}

可以通过其他方式完成吗?

标签: c#.net

解决方案


推荐阅读