Использование внедрения зависимостей вне конструктора контроллера

Итак, вот в чем проблема: мой проект mvc3 использует внедрение зависимостей и имеет базовый Generic IRepository класс, от которого наследуются другие репозитории.

Так что я могу пойти дальше и сделать это в контроллере:

public class SomethingController
{
    IOrderRepository repository;

    public SomethingController(IOrderRepository repo)
    {
        this.repository = repo;
    }

    public ActionResult SaveOrder(Order order)
    {
        repository.add(order)
        unitOfWork.CommitChanges();  // THIS works!
    }
}

Но теперь мне нужно использовать один из этих репозиториев в настраиваемом статическом неконтроллере, например:

static class OrderParser
{
    private IOrderRepository repo;

    public static DoWork()
    {
        repo = DependencyResolver.Current.GetService<IOrderRepository>();

        var ordersInDB = repo.GetAllOrders(); //THIS works!

        //But!
        var ordersForInsertion = new List<Order>();


        //do some backgroundworker magic                     
        //fetch txt files from an ftp server
        var ordersForInsertion = ParseTextFilesIntoOrders();

        foreach order in ordersForInsertion 
             repo.add(order)
        unitOfWork.CommitChanges();
        // THIS doesnt commit anything into the database
        // It also doesnt throw any exceptions
        // and repo isnt null or any of that
    }
}

Итак, в качестве теста я попытался сделать :

repo = DependencyResolver.Current.GetService<IOrderRepository>();

внутри класса контроллера, как в первом примере, чтобы увидеть, не зафиксировал ли он что-то, а это не так.(Делаем это правильно [внедрение репозиториев и unitOfWork через конструкторы] работает!)

Значит, это должно быть связано с DependencyResolver, верно?

Примечание: если есть еще какой-то код, я вам нужен опубликовать, спросить, и я отредактирую его здесь в мгновение ока!

Примечание 2: Спасибо!

РЕДАКТИРОВАТЬ1:

Относительно сверхбыстрого ответа w0lf Вот еще немного информации:

Мой класс OrderParser реализует backgroundWorker, который должен:

  • Спать на час
  • Список всех файлов (простых текстовых файлов) на FTP-сервере.
  • Отбросить те, которые уже проанализированы в базе данных.
  • Разберите новые файлы на объекты Order.
  • Зафиксируйте объекты в базе данных.
  • Начинайте снова и снова, пока не отключится электричество или что-то в этом роде :)

Все, что должно произойти без каких-либо действий пользователя, то есть действие не исходит от контроллера, поэтому все, что я делаю, это:

в моем классе загрузчика

Initialise()
{
    //Unrelated stuff
    OrderParser.DoWork()
}

И именно поэтому я реализовал его как статический класс (легко заменяемый на нестатический)

РЕДАКТИРОВАТЬ2:

Это было бы примерно так:

class OrderParser
{
    private IOrderRepository repo;

    public OrderParser(IOrderRepository foo)
    {
        this.repo = foo;
    }
    public static DoWork()
    {
        //use repo var!
    }
}

Но затем, когда я использую его в методе bootstrapper Initialize (), как мне это сделать, например:

class bootstrapper
{
    Initialize()
    {
        var parser = new OrderParser(/*how do i pass the dependency here?*/)
        parser.DoWork();
    }
}

EDIT3:

Вот еще несколько тестов, пожалуйста, потерпите меня!

Вот мой OrderParser снова:

class OrderParser
{
    public OrderParser(IOrderRepository foo, IContext unitOfWork)
    {
        foo.getall(); 

        foo.add(some_order);
        unitOfWork.commit(); 

    }
}

Test1:

public class SomeController
{
    IOrderRepository repository;

    public SomeController(IOrderRepository repo)
    {
        this.repository = repo;
    }

    public ActionResult SomeMethod(Order order)
    {
        repository.GetAll();    //WORKS

        repository.add(order)
        unitOfWork.CommitChanges();  // WORKS
    }
}

TEST2:

class bootstrapper
{
    Initialize()
    {
        //Build unity container..
        //set resolver..

        var parser = new OrderParser(container.Resolve<IOrderRepository>, container.Resolve<IContext>)
        //can getAll, cant commit.
    }
}

TEST3:

public class SomeController
{
    IOrderRepository controllers_repository;

    public SomeController(IOrderRepository repo)
    {
        this.controllers_repository = repo;
    }

    public ActionResult SomeMethod(Order order)
    {
        var parser = new OrderParser(DependencyResolver.Current.GetService<IOrderRepository>,
        DependencyResolver.Current.GetService<IContext>)   
        //can do getall, no commits


        var parser = new OrderParser(controllers_repository, controllers_icontext)
        // obviously works (can getall and commit)
    }
}

Кстати, когда я говорю «не могу зафиксировать», это не значит, что я получаю исключение или репозитории пустые, Неа. код работает так, как будто все в порядке, только БД не изменится.

7
задан Flimzy 12 June 2018 в 14:17
поделиться