Так вот в чем проблема, мой проект mvc3 использует Dependency Injection и имеет базовый класс 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: Спасибо!
EDIT1:
Относительно быстрого ответа w0lf
Вот еще немного информации:
Мой класс OrderParser реализует backgroundWorker, который должен:
- Спи час
- Список всех файлов (простые текстовые файлы) на FTP-сервере.
- Откажитесь от уже проанализированных в БД.
- Разобрать новые файлы в объекты Order.
- Зафиксируйте объекты в БД.
- Начинайте снова и снова, пока не отключится питание или что-то в этом роде:)
Все, что должно произойти без каких-либо действий пользователя, то есть действие не происходит из контроллера, поэтому все, что я делаю, это:
в моем классе начальной загрузки
Initialise()
{
//Unrelated stuff
OrderParser.DoWork()
}
И именно поэтому я реализовал его как статический класс (легко заменяемый на нестатический)
EDIT2:
Это было бы что-то вроде:
class OrderParser
{
private IOrderRepository repo;
public OrderParser(IOrderRepository foo)
{
this.repo = foo;
}
public static DoWork()
{
//use repo var!
}
}
Но затем, когда я создаю его экземпляр в методе начального загрузчика Initialize (), как я это сделаю, например ::106?
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)
}
}
Кстати, когда я говорю «не могу зафиксировать», я не получаю исключение, или репозитории нулевые, нет. код работает так, как будто все в порядке, только БД не изменится.