В моем решении есть два проекта: базовая библиотека классов .net с именем «Инфраструктура» и базовое веб-приложение .net с именем «Admin».
В разделе «Инфраструктура» я реализовал шаблон репозитория для приложения DBContext, например:
public partial class ApplicationDbContext : DbContext
{
....
}
Интерфейсы:
public interface IGenericRepository<T> where T : class
{
T Add(T t);
....
}
public interface ICustomersRepository : IGenericRepository<Customers>
{
Customers GetCustomerByCompanyCode(string companyCode);
void InsertOrUpdate(Customers toSync);
}
Generic:
public class GenericRepository<T> : IGenericRepository<T>, where T : class
{
protected ApplicationDbContext _context;
public GenericRepository(ApplicationDbContext context)
{
_context = context;
}
public virtual T Add(T t)
{
_context.Set<T>().Add(t);
_context.SaveChanges();
return t;
}
....
}
Конкретная:
public class CustomersRepository : GenericRepository<Customers>, ICustomersRepository
{
public CustomersRepository(ApplicationDbContext context) : base(context)
{
}
....
}
В веб-приложении:
- Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<ApplicationDbContext>(options => options.UseNpgsql(Configuration.GetConnectionString("DefaultConnection")));
....
services.AddScoped(typeof(IGenericRepository<>), typeof(GenericRepository<>));
services.AddScoped<ICustomersRepository, CustomersRepository>();
....
}
- CustomersController.cs
private readonly ICustomersRepository rep;
public CustomersController(ICustomersRepository rep, ....)
{
this.rep = rep;
....
}
public async Task DoImport()
{
....
rep.InsertOrUpdate(mapper.Map<Customers>(item.Result));
....
}
Работает, но очень медленно: 300.000 вставок за несколько часов. Если я не использую шаблон репозитория, но попробуйте вставить вызывающий ApplicationDBContext напрямую, например:
using (var _context = new ApplicationDbContext())
{
_context.Add(toSync);
_context.SaveChanges();
}
время работы: 300.000 вставок за 6 минут.
Почему это происходит? Является ли шаблон репозитория лучшим выбором для разделения уровня доступа к данным в основных проектах .net? Есть другие решения для этого?
Tnx заранее.