Создание базового класса репозитория OrmLite для ASP.NET - PullRequest
1 голос
/ 23 мая 2019

Я пытаюсь создать общий базовый класс, который я могу использовать во всем моем проекте.Я написал некоторый код, но все еще получаю экземпляр NULL на моем DbConnectionFactory.

Я создал проект веб-API ASP.Net и добавил файл 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);

    }
}

Базовый класс I 'я пытаюсь использовать

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 Controller

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 Ответ

2 голосов
/ 23 мая 2019

Возможно, вам потребуется использовать конструктор для контроллеров Web API или MVC, или же вы можете получить доступ к зависимостям в IOC ServiceStack через HostContext.TryResolve<T>, например:

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