Потребление классов обслуживания вне сада в пределах Сада - PullRequest
2 голосов
/ 06 декабря 2011

Недавно мы разработали библиотеку классов, которые используются внутри приложения MVC3. Приложение MVC3 использует Autofac для добавления контроллеров с необходимыми классами обслуживания во время выполнения. Библиотека использует свой собственный набор таблиц для хранения данных, которые могут находиться или не находиться в той же базе данных, что и хост-приложение.

Классы следуют шаблону внедрения зависимостей и в качестве примера выглядят примерно так (да, вы видели это миллион раз раньше) ...

public class PackageService : ServiceBase, IPackageService
{
    private readonly IRepository _db;
    private readonly IClientService _clientSvc;

    public PackageService(IRepository db, IClientService clientService)
    {
        _db = db;
        _clientSvc = clientService;
    }

    public ServiceResult<IEnumerable<Package>> FindPackagesBy(string searchTerm, out int totalRecords, int pageSize, int pageIndex)
    {
        //...
    }

    public ServiceResult<Package> GetPackage(string packageRef)
    {
        //...
    }
}

Мы хотели бы использовать эти классы в модулях, которые работают в Orchard CMS. Из того, что я прочитал на , как работает * * * * * * * * * в саду, казалось бы, что мне нужно украсить каждый класс, который я собираюсь использовать в Orchard, интерфейсом IDependency - что на самом деле не кажется хорошей идеей, учитывая, что это создаст зависимость от самого сада. Наши классы управляют своими собственными транзакциями / единицей работы, поэтому нет необходимости управлять собственным механизмом транзакций в садах. Это возможно? или мы сталкиваемся с созданием Orchard конкретных реализаций нашей существующей библиотеки?

Было бы приятно услышать от любого, кто уже прошел через это.

Ответы [ 2 ]

2 голосов
/ 08 декабря 2011

Разобрался сам ...

В модуле, который использует «внешнюю библиотеку», вы создаете папку Autofac, добавляете класс, который наследуется от модуля Autofac, и добавляете туда свои привязки (это стандартная процедура для настройки привязок в Autofac) - Orchard обнаружите это во время выполнения и введите контроллеры вашего модуля с необходимыми зависимостями.

Однако вызовы во внешнюю библиотеку включены в транзакцию запроса по умолчанию, поскольку именно так работает фруктовый сад. Поскольку моя библиотека вызывала SQL Server через EF4, я получал исключение «MSDTC недоступен». Вам нужно явно указать, что вы не хотите, чтобы эти операции были включены в транзакцию, поэтому ваш контроллер в конечном итоге будет выглядеть так ...

[Themed]
public class HomeController : Controller
{
    /* this service is from the external library, 
    which calls its own database */
    private readonly IPackageService _packageSvc;

    /* this dependency is injected, based upon the bindings
    i specified within the Autofac folder at module level */
    public HomeController(IPackageService packageService)
    {
        _packageSvc = packageService;
    }

    public ActionResult Index()
    {
        /* wrap the external lib call so it avoids inclusion
        within the orchard request transaction */
        using (new TransactionScope(TransactionScopeOption.Suppress))
        {
            var package = _packageSvc.GetPackage();
            var model = new HomePageModel()
            {
                Package = package
            };
            return View("ShowPackage", model);
        }

    }
}
2 голосов
/ 07 декабря 2011

Вам нужно будет взять зависимость от Orchard и «внедрить» IDependency, чтобы ввести их AFAIK.Но это не проигрышное предложение, для меня не похоже, что создание конкретной версии для Orchard будет такой большой работой по сравнению с тем, что вы описываете, особенно если вы хотите переместить данные в Orchard.

...