IAppSettings
не вводится в ваш UnitOfWork
, поэтому при вызове он будет нулевым
public class UnitOfWork : IUnitOfWork {
private IDbConnection _connection;
private IDbTransaction _transaction;
private IUserRepository _user;
private IRoleRepository _role;
private IAppSettings App;
private bool _disposed;
private bool _token;
public UnitOfWork(IAppSettings App) {
this.App = App
_connection = new SqlConnection(App.GetConnectionString());
_connection.Open();
_transaction = _connection.BeginTransaction();
_token = false;
}
//Remove the rest of the code for brevity
}
Предполагается, что UnitOfWork
также зарегистрирован в коллекции услуг.
public void ConfigureServices(IServiceCollection services) {
services.AddTransient<IAppSettings, AppSettings>();
services.AddTransient<IUnitOfWork, UnitOfWork>();
services.AddMvc();
}
Я бы также предложил переосмыслить текущий дизайн и избегать тесной связи UoW с проблемами реализации, такими как SqlConnection
.
Если вы остаетесь с ADO, тогда рассмотрите возможность использования абстракции IDbConnectionFactory
.
public class MyDbConnectionFactory : IDbConnectionFactory {
private readonly IAppSettings appSettings;
public MyDbConnectionFactory(IAppSettings appSettings) {
this.appSettings = appSettings;
}
public IDbConnection CreateConnection() {
return new SqlConnection(appSettings.GetConnectionString());
}
}
Что позволило бы реорганизовать UoW на
public class UnitOfWork : IUnitOfWork {
private IDbConnection _connection;
private IDbTransaction _transaction;
private IUserRepository _user;
private IRoleRepository _role;
private bool _disposed;
private bool _token;
public UnitOfWork(IDbConnectionFactory factory) {
_connection = factory.CreateConnection();
_connection.Open();
_transaction = _connection.BeginTransaction();
_token = false;
}
//Remove the rest of the code for brevity
}
При обычной регистрации службы
public void ConfigureServices(IServiceCollection services) {
services.AddTransient<IAppSettings, AppSettings>();
services.AddTransient<IDbConnectionFactory, MyDbConnectionFactory>();
services.AddTransient<IUnitOfWork, UnitOfWork>();
services.AddMvc();
}