2014-11-13 3 views
0

Я следую за подразделением работы с общим шаблоном репозитория в моем проекте WebApi. В настоящее время я не использую ** методы Async, предоставляемые Linq и EF6.Внедрить Async и синхронные методы?

Но я начал внедрять async. Так что теперь хранилище будет выглядеть так:

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); 
} 

Я тогда слой услуг со всеми слоями обслуживания, и на вершине, что контроллеры

Лучше всего использовать методы async и sync или просто сохранить методы async сейчас?

+1

Это действительно зависит от прецедента. Если вы хотите, чтобы все пользователи вашего API были асинхронными, выставляйте только асинхронные конечные точки. В противном случае, разоблачите оба. –

ответ

0

Я думаю, что подход заключается в том, чтобы разоблачать как методы асинхронного, так и синхронного.

Другая идея состоит в том, чтобы создать хранилище для каждого объекта вы ссылаетесь нравится:

public interface IUserRepository : IRepository<UserModel, int> 
    { 
     UserModel GetByEmail(string email); 
     Task<UserModel> GetByEmail(string email); 
    } 


public interface IRepository<TModel, TKey> where TModel : class 
    { 
    } 

Вы можете попробовать что-то подобное, но только работает гладко в теории, потому что Wait блокирует текущий поток.

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; 
} 
+0

Если подход состоит в том, чтобы разоблачить оба метода, тогда код удвоится. Или разрешено ли использовать методы aaync в методах синхронизации? –

+0

Вы можете написать методы async, если вы хотите, чтобы там была какая-то другая логика, а в ваших синхронизированных методах просто используйте wait() –

Смежные вопросы