Dependency injection 在orchard中使用非orchard服务类

Dependency injection 在orchard中使用非orchard服务类,dependency-injection,autofac,orchardcms,Dependency Injection,Autofac,Orchardcms,我们最近开发了一个类库,这些类在MVC3应用程序内部使用。MVC3应用程序使用Autofac在运行时向控制器注入所需的服务类。库使用自己的一组表来存储数据,这些数据可能与主机应用程序位于同一数据库中,也可能不在同一数据库中 这些类遵循依赖项注入模式,作为一个例子,它们看起来像这样(是的,您以前已经看过一百万次了) 公共类PackageService:ServiceBase,IPackageService { 私有只读存储数据库; 专用只读IClientService_客户端svc; 公共包服务(

我们最近开发了一个类库,这些类在MVC3应用程序内部使用。MVC3应用程序使用Autofac在运行时向控制器注入所需的服务类。库使用自己的一组表来存储数据,这些数据可能与主机应用程序位于同一数据库中,也可能不在同一数据库中

这些类遵循依赖项注入模式,作为一个例子,它们看起来像这样(是的,您以前已经看过一百万次了)

公共类PackageService:ServiceBase,IPackageService
{
私有只读存储数据库;
专用只读IClientService_客户端svc;
公共包服务(IRepository db、IClientService客户端服务)
{
_db=db;
_clientSvc=clientService;
}
public ServiceResult FindPackagesBy(字符串搜索项、out int totalRecords、int pageSize、int pageIndex)
{
//...
}
公共服务结果GetPackage(字符串packageRef)
{
//...
}
}
我们希望在Orchard CMS中运行的模块中使用这些类。从我所读到的内容来看,似乎我需要用IDependency接口来装饰我打算在Orchard中使用的每个类——考虑到这会产生对Orchard本身的依赖,这似乎不是一个好主意。我们的类管理自己的事务/工作单元,因此不需要由果园自己的事务机制来管理。这可能吗?还是我们面临着对现有库进行特定于Orchard的实现


很高兴听到任何已经经历过这种情况的人的意见。

您需要依赖Orchard,并“实施”独立性,以便让他们尽快接受注射。但这并不是一个失败的主张,在我看来,制作一个特定于Orchard的版本并不像你所描述的那么困难,特别是如果你想将数据移动到Orchard。

我自己就解决了这个问题

在使用“外部库”的模块内,您创建一个Autofac文件夹,并添加一个从Autofac模块继承的类,并在其中添加绑定(这是在Autofac中设置绑定的标准过程)-Orchard将在运行时发现这一点,并向您的模块控制器注入所需的依赖项

但是,对外部库的调用默认包含在请求事务中,因为这是orchard的工作方式。因为我的库是通过EF4调用SQL Server的,所以我得到了一个异常“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);
        }

    }
}

我们不会把数据转移到乌节。如果我们不能使用一些不是专门为orchard编写的组件,那么(对于orchard)看起来一点都不好。我对此进行了更深入的研究,看起来您可以编写一个autofac模块,使您的组件可注射,听起来您可能很熟悉。至于其余部分,只要您的组件对在嵌套事务中运行不敏感,您就应该始终在Orchard启动的事务中运行,实际上您应该是黄金级的。感谢您提出这个问题,我对Autofac模块一无所知。是的,我对创建绑定模块很熟悉,但似乎没有关于如何在orchard模块中使用这些类并将其注入的文档。你是从哪里读到关于为orchard制作autofac模块的?因此,在我看来,从上面的讨论线索来看,如果autofac模块是自动拾取的,如果你用注册组件的autofac模块构建了orchard模块,你应该能够让它们注入到你想要的任何地方。是的,我自己。你的答案,或者你提供的链接,都给了我我希望实现的目标,而用IDependency装饰每个类正是我试图避免的。你应该尝试去链接。最后一组是在Orchard的autofac模块上。
[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);
        }

    }
}