为ASP.NET创建OrmLite信息库基类

时间:2019-05-23 09:46:46

标签: dependency-injection asp.net-web-api2 servicestack ormlite-servicestack

我正在尝试创建一个可以在整个项目中使用的通用基类。我已经编写了一些代码,但在DbConnectionFactory上仍然得到NULL实例。

我已经创建了一个ASP.Net Web API项目并添加了AppHost文件。我正在使用Funq和Simple Injector一起将自定义服务注入到Api控制器中。

AppHost.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>();
    }
}

1 个答案:

答案 0 :(得分:2)

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

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