问题描述
我正在创建一个服务,该服务需要为我们的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应用程序一样工作,效果更好。
谢谢
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 (将#修改为@)