Postgres数据库具有多个方案,例如company1,company2,... companyN
浏览器发送包含方案名称的cookie。数据访问操作应在此方案中发生。Web应用程序用户可以选择不同的方案。在这种情况下,将设置不同的cookie值。
使用了Npgsql EF核心数据提供程序。
ASP NET MVC 5 Core应用程序在StartUp.cs中注册了工厂:
public void ConfigureServices(IServiceCollection services)
{
services.AddHttpContextAccessor();
services.AddScoped<IEevaContextFactory, EevaContextFactory>();
....
家庭控制器尝试使用它:
public class HomeController : EevaController
{
public ActionResult Index()
{
var sm = new SchemeManager();
sm.PerformInsert();
....
由于工厂成员为null,因此将引发异常。如何解决呢?
public interface IEevaContextFactory
{
EevaContext Create();
}
public class EevaContextFactory : IEevaContextFactory
{
private IHttpContextAccessor httpContextAccessor;
private IConfiguration configuration;
public EevaContextFactory(IHttpContextAccessor httpContextAccessor, IConfiguration configuration)
{
this.httpContextAccessor = httpContextAccessor;
this.configuration = configuration;
}
public EevaContext Create()
{
var builder = new DbContextOptionsBuilder<EevaContext>();
var pathbase = httpContextAccessor.HttpContext.Request.PathBase.Value;
var scheme = httpContextAccessor.HttpContext.Request.Cookies["Scheme"];
var csb = new NpgsqlConnectionStringBuilder()
{
Host = pathbase,
SearchPath = scheme
};
builder.UseNpgsql(csb.ConnectionString);
return new EevaContext(builder.Options);
}
}
方案数据访问方法:
public class SchemeManager
{
readonly IEevaContextFactory factory;
public SchemeManager(IEevaContextFactory factory)
{
this.factory = factory;
}
public SchemeManager()
{
}
public void PerformInsert()
{
using (var context = factory.Create())
{
var commandText = "INSERT into maksetin(maksetin) VALUES (CategoryName)";
context.Database.ExecuteSqlRaw(commandText);
}
}
}
var sm = new SchemeManager()
...将在SchemeManager上调用无参数构造函数,因此不会注入IEevaContextFactory。您应该将工厂注入控制器,然后将其传递给SchemeManager。
删除您的无参数构造函数。不需要
public class HomeController : EevaController
{
private IEevaContextFactor eevaFactory;
public HomeController(IEevaContextFactory factory)
{
eevaFactory = factory;
}
public ActionResult Index()
{
var sm = new SchemeManager(eevaFactory);
sm.PerformInsert();
....
}
}
您的另一个选择是将SchemeManager放入DI容器中,然后DI容器将在构造函数上自动解析IEevaContextFactory,然后将SchemeManager注入到您的控制器中。
无论哪种方式,都删除该无参数的构造函数。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句