dependency-injection - 为 ASP.NET 创建 OrmLite 存储库基类
问题描述
我正在尝试创建一个可以在整个项目中使用的通用基类。我已经编写了一些代码,但仍然在我的 DbConnectionFactory 上获得了一个 NULL 实例。
我创建了一个 ASP.Net web api 项目并添加了 AppHost 文件。我正在使用 Funq 和 Simple Injector 将我的自定义服务注入 Api 控制器。
应用主机.cs
public class AppHost : AppHostBase
{
public AppHost() : base("Erp", typeof(AppHostService).Assembly)
{
}
public override void Configure(Container container)
{
// init
var simpleInjectorContainer = new SimpleInjector.Container();
var erpConnection = ConnectionStrings.ErpLocal;
var isLocal = HelperTools.IsLocalPath();
// check
if (isLocal)
{
erpConnection = ConnectionStrings.ErpOnline;
}
// mvc
ControllerBuilder.Current.SetControllerFactory(new FunqControllerFactory(container));
// register funq services
container.Register<IErpDbConnectionFactory>(c => new ErpDbConnectionFactory(erpConnectionString));
container.RegisterAutoWiredAs<CategoryService, ICategoryService>();
container.RegisterAutoWiredAs<ManufacturerService, IManufacturerService >();
container.RegisterAutoWiredAs<ProductService, IProductService>();
container.RegisterAutoWiredAs<ProductAttributeService, IProductAttributeService>();
container.RegisterAutoWiredAs<SpecificationAttributeService, ISpecificationAttributeService>();
//...
// simple injector services
SimpleInjectorInitializer.Initialize(simpleInjectorContainer, isLocal);
// register SimpleInjector IoC container, so ServiceStack can use it
container.Adapter = new SimpleInjectorIocAdapter(simpleInjectorContainer);
}
}
我正在尝试使用的基类
public abstract class ApiOrmLiteController : ApiController
{
IDbConnection _erpDb;
public virtual IErpDbConnectionFactory ErpDbConnectionFactory { get; set; }
public virtual IDbConnection ErpDb => _erpDb ?? (_erpDb = ErpDbConnectionFactory.OpenDbConnection());
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
_erpDb?.Dispose();
}
}
Web API 控制器
public class ShippingController : ApiOrmLiteController
{
#region Fields
private readonly IOrderService _orderService;
private readonly IAddressService _addressService;
private readonly ICustomerService _customerService;
private readonly IPdfService _pdfService;
private readonly IMessageService _messageService;
private readonly ITranslationService _translationService;
#endregion Fields
#region Ctor
public ShippingController(IOrderService orderService, IAddressService addressService, ICustomerService customerService, IPdfService pdfService, IMessageService messageService, ITranslationService translationService)
{
_orderService = orderService;
_addressService = addressService;
_customerService = customerService;
_pdfService = pdfService;
_messageService = messageService;
_translationService = translationService;
}
#endregion Ctor
[HttpGet]
[System.Web.Http.Route("Test")]
public void Test()
{
var products = ErpDb.Select<Category>();
}
}
解决方案
您可能需要对 Web API 或 MVC 控制器使用构造函数注入,或者您可以通过 访问 ServiceStack 的 IOC 中的依赖项HostContext.TryResolve<T>
,例如:
public virtual IDbConnection ErpDb => _erpDb ??
(_erpDb = HostContext.TryResolve<IErpDbConnectionFactory>().OpenDbConnection());
推荐阅读
- vaadin - Vaadin 10+:tomcat 必须扫描哪些罐子?
- java - 当我在 CardStackView 中的最后一项时?
- reactjs - 异步等待 Firestore 用户 ID
- java - 无法访问 JavaFX GridPane setRow 或 setCol 方法
- python - 将 PyQT5 信号从服务类连接到多个插槽
- javascript - 实现最低限度的承诺功能以了解其他承诺框架
- java-stream - Jenkins管道脚本将文件复制或移动到另一个目的地
- tensorflow - 如何在加载的模型上设置 input_tensor
- python - 如何在烧瓶上动态更新我的 Python 图表?
- nginx - “proxy_pass”不能在正则表达式给出的位置包含 URI 部分