我需要为Windows 8 App实现完全异步架构,我使用SQLite for winRT&数据层中的SQLite.Net。
到目前为止我做了什么:
DAL
背景:
public interface IContext
{
Task InitializeDatabase();
SQLiteAsyncConnection GetAsyncConnection();
}
public class SQLiteAsyncContext : IContext
{
private SQLiteAsyncConnection _context;
private String _dBPath;
public SQLiteAsyncContext()
{
this._dBPath = Path.Combine(
Windows.Storage.ApplicationData.Current.LocalFolder.Path, "DBName");
this._context = new SQLiteAsyncConnection(_dBPath);
}
public async Task InitializeDatabase()
{
await _context.CreateTableAsync<User>();
}
public SQLiteAsyncConnection GetAsyncConnection()
{
return _context;
}
}
通用存储库:
public interface IAsyncRepository<T> where T : class
{
Task<int> AddAsync(T entity);
Task<int> UpdateAsync(T entity);
Task<int> RemoveAsync(T entity);
Task<IList<T>> GetAllAsync();
Task<IList<T>> GetBy(System.Linq.Expressions.Expression<Func<T, bool>> predicate);
Task SaveChanges();
}
public class AsyncRepository<T> : IAsyncRepository<T> where T : class, new()
{
private SQLiteAsyncConnection _context;
public AsyncRepository(IContext _context)
{
this._context = _context.GetAsyncConnection();
}
public async Task<int> AddAsync(T entity)
{
return await _context.InsertAsync(entity);
}
public async Task<int> UpdateAsync(T entity)
{
return await _context.UpdateAsync(entity);
}
public async Task<int> RemoveAsync(T entity)
{
return await _context.DeleteAsync(entity);
}
public async Task<IList<T>> GetAllAsync()
{
return await _context.Table<T>().ToListAsync();
}
public async Task<IList<T>> GetBy(System.Linq.Expressions.Expression<Func<T, bool>> predicate)
{
return await _context.Table<T>().Where(predicate).ToListAsync();
}
public Task SaveChanges()
{
throw new NotImplementedException();
}
}
BL
public interface IAsyncServices<T> where T : class
{
Task<int> AddAsync(T entity);
Task<int> UpdateAsync(T entity);
Task<int> RemoveAsync(T entity);
Task<IList<T>> GetAllAsync();
Task<IList<T>> GetBy(System.Linq.Expressions.Expression<Func<T, bool>> predicate);
}
public class AsyncUserService : IAsyncServices<User>
{
private readonly IAsyncRepository<User> _asyncUserRepository;
public AsyncUserService(IAsyncRepository<User> _asyncUserRepository)
{
this._asyncUserRepository = _asyncUserRepository;
}
public async Task<int> AddAsync(User entity)
{
return await _asyncUserRepository.AddAsync(entity);
}
public async Task<int> UpdateAsync(User entity)
{
return await _asyncUserRepository.UpdateAsync(entity);
}
public async Task<int> RemoveAsync(User entity)
{
return await _asyncUserRepository.RemoveAsync(entity);
}
public async Task<IList<User>> GetAllAsync()
{
return await _asyncUserRepository.GetAllAsync();
}
public async Task<IList<User>> GetBy(Expression<Func<User, bool>> predicate)
{
return await _asyncUserRepository.GetBy(predicate);
}
}
我有一些问题:
提前致谢。
答案 0 :(得分:0)
是否可以实现UnitOfWork模式 SQliteAsyncConnection。
我想这在很大程度上取决于您的业务任务。你不能发明只是抽象的架构神奇地涵盖所有可能的情况。异步数据处理本身不是玩具。与数据库结合使用,很快就会成为无法管理的代码。
如何执行提交&amp;存储库中的RollBack。
首先,您需要使用某种锁定机制停止对Repository的访问。然后,您需要等待所有异步操作完成。然后你提交/回滚和解锁。这当然是通用的,可能不适合您的工作流程。
我应该改进什么?
你告诉;)
实际上,我强烈建议不要使用通用异步数据库访问。仅在您确实需要异步数据库操作时才使用异步数据库操作。通过主键获取一条记录不需要是异步的。它的速度非常快。