在TopShelf服务.Net Framework中使用Autofac将连接字符串注入DbContext类

问题描述

我正在创建一个服务,该服务需要为我们的ERP系统引用旧版DLL,因此,不幸的是,.NET framework是我需要这样做的方式。我尝试使用Core Worker Service,但对DLL的调用无法正常工作。

我喜欢使用TopShelf,并查找DI与此一起使用,Autofac似乎是可行的方法,并且它具有TopShelf支持。我不喜欢在配置文件中保留任何设置,以便更轻松地将其部署到其他环境。我们有一个完整的系统,可将设置与您所处的环境(开发,测试,生产等)联系在一起。在Core应用程序中,我只是在启动时注入了连接字符串,一切都很好。在此应用程序中,我想在启动服务时注入连接字符串,并能够随时启动DbContect类,并使其使用该连接字符串。

由于我脚手架了我的数据层并且不想修改生成的DbContext,所以我创建了另一个子类(MyContext.Custom.cs),该子类的构造函数允许我传递连接字符串

 public MyContext(string name) : base(name)
    { }

在我的Program.cs中,我将一个Autofac容器添加到TopShelf

HostFactory.Run(serviceConfig =>
    {
        serviceConfig.UseAutofacContainer(container);
        // etc...
    }

容器是在一个函数中构建的,我尝试了下面的许多示例,但似乎无法使用参数作为构造函数。这是我尝试过的几种方法。每个方法都不会产生错误,但是会运行我的认构造函数,该构造函数将在配置文件中查找命名的连接字符串。

static IContainer BuildContainer()
{
    string myConnectionString = AppConfig.Instance.Settings["MyConnectionString"];

    var builder = new ContainerBuilder();

    //builder.RegisterType<MyContext>()
    //    .UsingConstructor(typeof(string))
    //    .WithParameter("name",myConnectionString)
    //    .InstancePerLifetimeScope();

    //builder.Register(c => new MyContext(myConnectionString)).As<MyContext>();
    //.WithParameter("name",myConnectionString);

    //builder.RegisterType<MyContext>()
    //    .WithParameter("name",myConnectionString)
    //    .AsSelf();
    //.InstancePerLifetimeScope();

    builder.Register(c => new MyContext(myConnectionString)).AsSelf();

    builder.RegisterType<MainService>();
    return builder.Build();
}

我已经尝试使用.As和.AsSelf()进行每个变体。我已经放入.InstancePerLifetimeScope(),并且也将其省略了。我真的不确定在这种情况下将范围设置为什么,但认为它应该终身有效。不管我尝试了什么,似乎都无法使用它的构造函数

如果我遗漏了任何信息,可以随时填写。希望有人这样做。我想我每次实例化一个DbContext时都可以传递连接字符串,但我希望它能像Core应用程序一样工作,效果更好。

谢谢

编辑: 添加代码显示我如何使用DbContext

public bool Start()
{
    using(var db = new MyContext())
    {
        var warehouse = (from w in db.Warehouses
                         where w.WarehouseCode == "ABCD"
                         select w).FirstOrDefault(); 
    }
    // other code...
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)