首页 > 解决方案 > 为 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>();
    }
}

标签: dependency-injectionasp.net-web-api2servicestackormlite-servicestack

解决方案


您可能需要对 Web API 或 MVC 控制器使用构造函数注入,或者您可以通过 访问 ServiceStack 的 IOC 中的依赖项HostContext.TryResolve<T>,例如:

public virtual IDbConnection ErpDb => _erpDb ?? 
    (_erpDb = HostContext.TryResolve<IErpDbConnectionFactory>().OpenDbConnection());

推荐阅读