将连接字符串注入DbContext

时间:2017-10-31 18:10:00

标签: c# entity-framework ninject

我有外部服务,我无法修改,但我只能添加新的类库来扩展它的功能。我的问题是我的类库使用EF-> Repository-> Service和IOC容器,当我将库附加到外部服务时,它不起作用,因为此服务没有定义连接字符串。我发现我可以使用Service Locator在我的类库中定义实现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());
        }
    }
}

我创建了自己的部分类来将连接字符串传递给构造函数:

public partial class Entities
{
    public Entities(string name)
        :base(name)
    {
    }
}

因为自动生成的类不允许传递连接字符串(我不想修改它):

public partial class Entities : DbContext
{
   public Entities()
    : base("name=Entities")
   {
   }
}

当我在调试模式下运行我的测试应用程序时,我看到它引用了自动生成的DbContext类,而不是由我创建的。正如我之前所说,我无法修改外部服务,只需将连接字符串添加到App.config文件中即可。请为我的问题提供任何可能的解决方案。我愿意接受设计变更。

1 个答案:

答案 0 :(得分:1)

看来,您的某些课程期望Entities依赖而不是DbContext。在这种情况下,Ninject倾向于回退到隐式自绑定,并选择具有可以解析的依赖关系的构造函数(在本例中为默认值)。

请尝试使用此绑定:

_kernel.Bind<Entities>().ToConstructor(_ => new Entities(name));