我正在使用以域为中心的架构创建asp.net应用程序。我在Application层中遇到问题,因为依赖注入无法在Demeter.Application.Interfaces.IDatabaseService
中解析Demeter.Application.Events.Queries.QueryEvent.GetEventsListQuery
。有人可以帮我修复依赖注入吗?
System.InvalidOperationException:无法解析类型的服务 尝试时'Demeter.Application.Interfaces.IDatabaseService' 启用 'Demeter.Application.Events.Queries.QueryEvent.GetEventsListQuery'。
namespace Demeter.Application.Events.Queries.QueryEvent
{
using System.Collections.Generic;
using Commands.CreateEvent;
using Demeter.Application.Interfaces;
using AutoMapper;
using Domain;
public class GetEventsListQuery : IGetEventsListQuery
{
public List<ListEventModel> Execute()
{
var events = this.databaseService.SelectEventsForList();
//// Use AutoMapper to convert events (IEnumerable<Event>) to (List<ListEventModel>)
//IMapper mapperConfig = this.mapperConfig.CreateMapper();
//return Mapper.Map<IEnumerable<Event>, List<ListEventModel>>(events);
return null;
}
public GetEventsListQuery(IDatabaseService databaseService)
{
this.databaseService = databaseService;
//TO-DO: Move this to mapper congigfration function
//this.mapperConfig = new MapperConfiguration(cfg => {
// cfg.CreateMap<Event, ListEventModel>();
//});
}
private readonly IDatabaseService databaseService;
private readonly MapperConfiguration mapperConfig;
}
}
namespace Demeter.Application.Interfaces
{
using System.Collections.Generic;
using Domain;
public interface IDatabaseService
{
void InsertEvent(Event @event);
void UpdateEvent(Event @event);
void DeleteEvent(long recordId);
IEnumerable<Event> SelectEventsForList();
}
}
startup.cs表单服务
public class Startup
{
public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
.AddEnvironmentVariables();
this.Configuration = builder.Build();
}
public IConfigurationRoot Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddScoped(provider =>
{
var connectionString = new SqlConnection(Configuration["ConnectionStrings:DevConnection"]);
return connectionString;
});
// Register the Swagger generator, defining one or more Swagger documents
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new Info { Title = "My API", Version = "v1" });
});
services.AddMvc();
services.AddTransient<IGetEventsListQuery, GetEventsListQuery>();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddConsole(this.Configuration.GetSection("Logging"));
loggerFactory.AddDebug();
app.UseMvc();
// Enable middleware to serve generated Swagger as a JSON endpoint.
app.UseSwagger();
// Enable middleware to serve swagger-ui (HTML, JS, CSS etc.), specifying the Swagger JSON endpoint.
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1");
});
}
}
}
这是在Persistance中实现IDatabaseService
namespace Demeter.Persistance.Services
{
using System;
using System.Collections.Generic;
using Application.Interfaces;
using Domain;
using System.Data;
using System.Data.SqlClient;
using Dapper;
public class DatabaseService : IDatabaseService
{
public void InsertEvent(Event @event)
{
throw new NotImplementedException();
}
public void UpdateEvent(Event @event)
{
throw new NotImplementedException();
}
public void DeleteEvent(long recordId)
{
throw new NotImplementedException();
}
public IEnumerable<Event> SelectEventsForList()
{
using (IDbConnection dbConnection = Connection)
{
return dbConnection.Query<Event>("SELECT * FROM Event");
}
}
public IDbConnection Connection
{
get
{
return new SqlConnection(connectionString);
}
}
public DatabaseService(string connectionString)
{
this.connectionString = connectionString;
}
private readonly string connectionString;
}
}
答案 0 :(得分:2)
您尚未注册IDatabaseService
界面的具体类型。添加如下这样的一行:
services.AddTransient<IDatabaseService, DatabaseService>();
没有它,DI框架不知道要注入GetEventsListQuery
类的构造函数。
我建议阅读the docs如何在.Net Core中完成依赖注入。
答案 1 :(得分:2)
您需要将IDatabaseService
注册到ASP.NET Core的依赖注入引擎。
这是在ConfigureServices
文件的Startup.cs
方法内完成的。
通过查看您的DatabaseService
实施,它似乎依赖于连接字符串,但在您的ConfigureServices
方法中,您已经提供了完整的SqlConnection
。
要使用DI完成所有工作,您需要在构造函数中直接使用连接进行一些更改:
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddScoped<IDbConnection>(provider => new SqlConnection(Configuration["ConnectionStrings:DevConnection"]));
// Register the Swagger generator, defining one or more Swagger documents
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new Info { Title = "My API", Version = "v1" });
});
services.AddMvc();
services.AddTransient<IGetEventsListQuery, GetEventsListQuery>();
// Register your database service
services.AddScoped<IDatabaseService, DatabaseService>();
}
public class DatabaseService : IDatabaseService
{
public void InsertEvent(Event @event)
{
throw new NotImplementedException();
}
public void UpdateEvent(Event @event)
{
throw new NotImplementedException();
}
public void DeleteEvent(long recordId)
{
throw new NotImplementedException();
}
public IEnumerable<Event> SelectEventsForList()
{
_dbConnection.Query<Event>("SELECT * FROM Event");
}
public DatabaseService(IDbConnection dbConnection)
{
_dbConnection = dbConnection;
}
private readonly IDbConnection _dbConnection;
}
在示例中,我将注册添加为&#34;作用域&#34;因为它似乎直接依赖于数据库连接(也声明为作用域)。
这也将确保每个请求创建并使用一个IDatabaseService
。