Передача внедренной зависимости Виндзорского замка в параллельный поток - проблема Dispose ()

Я использую ASP.NET MVC с Castle Windsor в качестве контейнера IoC с набором стиля жизни компонента PerWebRequest. Мой репозиторий (который является внедренной зависимостью) создает экземпляр Entity Framework ' s ObjectContext в конструкторе, и я сохраняю его в частной переменной экземпляра. Мой репозиторий реализует IDisposable, а внутри моего метода Dispose я располагаю ObjectContext. Я думаю, что все это довольно стандартно, и вот упрощенная иллюстрация:

Репозиторий:

 public class Repository : IRepository {

    private MyContext _dc; // MyContext inherits from ObjectContext

    public Repository() {
        _dc = new MyContext();
    }

    public void Dispose() {;
        _dc.Dispose();
    }
}

Чтобы убедиться, что нет утечки памяти и вызывается Dispose () моего репозитория, я переопределяю метод ReleaseController DefaultControllerFactory, чтобы освободить контейнер Виндзора:

public class WindsorControllerFactory : DefaultControllerFactory {
        IWindsorContainer _container;

        public WindsorControllerFactory(IWindsorContainer container) {
            _container = container;
            // Do stuff to register all controller types
        }

        protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType) {
            // Do stuff to resolve dependency
        }

        public override void ReleaseController(IController controller) {
            // by releasing the container, Windsor will call my Dispose() method on my repository
            _container.Release(controller);
            base.ReleaseController(controller);
        }
    }

. Думаю, все это довольно стандартно. Однако я хотел бы выделить параллельный поток, и внутри этого параллельного потока использовать зависимость IRepository. Моя проблема в том, что мой репозиторий будет уже удален к тому моменту, когда я его использую:

public class HomeController : Controller {

    IRepository _repository;

    public HomeController(IRepository repository) {
        _repository = repository;
    }

    public ActionResult Index() {
        var c = _repository.GetCompany(34);

        new Task(() => {
            System.Threading.Thread.Sleep(2000); // simulate long running task
            // will throw an error because my repository (and therefore, ObjectContext) will have been disposed.
            var c2 = _repository.GetCompany(35);
        }).Start();

        return Content(c.Name, "text/plain");
    }
}

Как другие люди решают эту проблему? Как передать зависимости параллельному потоку?

Заранее спасибо. {var str = ""; for (...

Эта функция JavaScript принимает массив чисел (в диапазоне 0-255) и преобразует его в строку в кодировке base64, а затем при необходимости разбивает длинные строки:

function encode(data)
{
  var str = "";
  for (var i = 0; i < data.length; i++)
    str += String.fromCharCode(data[i]);

  return btoa(str).split(/(.{75})/).join("\n").replace(/\n+/g, "\n").trim();
}

Можете ли вы сделать то же самое в меньше кода? Можете ли вы сделать это, чтобы он работал быстрее? Переносимость без объекта, используйте новые языковые функции, если хотите, но он должен быть в JavaScript.

6
задан Cœur 27 October 2018 в 09:31
поделиться