将连接字符串注入 DbContext
Inject connection string to DbContext
我有无法修改的外部服务,但我只能向其添加新的 Class 库以扩展其功能。我的问题是我的 class 库使用 EF->Repository->Service 和 IOC 容器,当我将我的库附加到外部服务时它不起作用,因为该服务没有定义连接字符串。我发现我可以使用服务定位器在我的 Class 库中定义实现 IOC 容器:
internal class ServiceLocator
{
static ServiceLocator()
{
Current = new DefaultServiceLocator();
}
public static IServiceLocator Current { get; }
private sealed class DefaultServiceLocator : IServiceLocator
{
private readonly IKernel _kernel; // Ninject kernel
public DefaultServiceLocator()
{
_kernel = new StandardKernel();
LoadBindings();
}
public T Get<T>()
{
return _kernel.Get<T>();
}
private void LoadBindings()
{
string name = ""; // connection string
_kernel.Bind<DbContext>().ToConstructor(_ => new Entities(name));
_kernel.Bind<IRegionService>().To<RegionService>();
_kernel.Bind<IRegionRepository>().To<RegionRepository>();
_kernel.Bind<IMapper>().ToConstant(AutoMapperConfig.Initialize());
}
}
}
我创建了自己的部分 class 以将连接字符串传递给构造函数:
public partial class Entities
{
public Entities(string name)
:base(name)
{
}
}
因为自动生成的 class 不允许传递连接字符串(我不想修改它):
public partial class Entities : DbContext
{
public Entities()
: base("name=Entities")
{
}
}
当我 运行 我的测试应用程序处于调试模式时,我看到它指的是自动生成的 DbContext class 而不是我创建的。正如我之前所说,我无法修改外部服务以将连接字符串添加到 App.config 文件中。请为我的问题提供任何可能的解决方案。我愿意接受设计更改。
看来,您的一些 类 期望 Entities
依赖而不是 DbContext
。在这种情况下 Ninject 倾向于回退到隐式自绑定并选择具有可以解析的依赖项的构造函数(在这种情况下为默认值)。
试试这个绑定:
_kernel.Bind<Entities>().ToConstructor(_ => new Entities(name));
我有无法修改的外部服务,但我只能向其添加新的 Class 库以扩展其功能。我的问题是我的 class 库使用 EF->Repository->Service 和 IOC 容器,当我将我的库附加到外部服务时它不起作用,因为该服务没有定义连接字符串。我发现我可以使用服务定位器在我的 Class 库中定义实现 IOC 容器:
internal class ServiceLocator
{
static ServiceLocator()
{
Current = new DefaultServiceLocator();
}
public static IServiceLocator Current { get; }
private sealed class DefaultServiceLocator : IServiceLocator
{
private readonly IKernel _kernel; // Ninject kernel
public DefaultServiceLocator()
{
_kernel = new StandardKernel();
LoadBindings();
}
public T Get<T>()
{
return _kernel.Get<T>();
}
private void LoadBindings()
{
string name = ""; // connection string
_kernel.Bind<DbContext>().ToConstructor(_ => new Entities(name));
_kernel.Bind<IRegionService>().To<RegionService>();
_kernel.Bind<IRegionRepository>().To<RegionRepository>();
_kernel.Bind<IMapper>().ToConstant(AutoMapperConfig.Initialize());
}
}
}
我创建了自己的部分 class 以将连接字符串传递给构造函数:
public partial class Entities
{
public Entities(string name)
:base(name)
{
}
}
因为自动生成的 class 不允许传递连接字符串(我不想修改它):
public partial class Entities : DbContext
{
public Entities()
: base("name=Entities")
{
}
}
当我 运行 我的测试应用程序处于调试模式时,我看到它指的是自动生成的 DbContext class 而不是我创建的。正如我之前所说,我无法修改外部服务以将连接字符串添加到 App.config 文件中。请为我的问题提供任何可能的解决方案。我愿意接受设计更改。
看来,您的一些 类 期望 Entities
依赖而不是 DbContext
。在这种情况下 Ninject 倾向于回退到隐式自绑定并选择具有可以解析的依赖项的构造函数(在这种情况下为默认值)。
试试这个绑定:
_kernel.Bind<Entities>().ToConstructor(_ => new Entities(name));