我在WebApi项目中使用通用存储库模式遵循工作单元。目前我没有使用Linq和EF6提供的**异步方法。
但我已经开始实现异步。所以现在存储库看起来像这样:
public interface IRepository<T> where T : class
{
void Add(T entity);
void Update(T entity);
void Delete(T entity);
T Get(int id);
T Get(Expression<Func<T, bool>> predicate);
Task<T> GetAsync(int id, CancellationToken ct);
Task<T> GetAsync(Expression<Func<T, bool>> predicate, CancellationToken ct);
}
工作单位:
public interface IUnitOfWork<C>
{
int Commit();
Task<int> CommitAsync(CancellationToken ct);
}
然后,我将服务层包含所有服务层,并在控制器
之上最佳做法是同时使用异步和同步方法,还是仅保留异步方法?
答案 0 :(得分:0)
我认为这种方法是公开异步和同步方法。
另一个想法是为您引用的每个实体创建一个存储库,如:
public interface IUserRepository : IRepository<UserModel, int>
{
UserModel GetByEmail(string email);
Task<UserModel> GetByEmail(string email);
}
public interface IRepository<TModel, TKey> where TModel : class
{
}
你可以尝试这样的事情但是理论上工作顺利,因为等待阻止了当前的线程。
public static async Task<Model> GetModelAsync()
{
// async logic & return task
}
public static Model CallGetModelAsyncAndWaitForResult()
{
var task = GetModelAsync();
task.Wait(); // Blocks current thread
var result = task.Result;
return result;
}