如何解析Orchard CMS中的对象?

时间:2012-08-16 07:00:26

标签: c# asp.net-mvc dependency-injection inversion-of-control orchardcms

我在Orchard CMS的模块中有一个服务类,它依赖于某些依赖项,例如IContentManager,它实现了IDependency接口。 在我的控制器中,我通过注入使用它并且它工作得非常好。

我的服务:

public class AddressService : IAddressService
{
    private readonly IContentManager _contentManager;
    private readonly IOrchardServices _orchardService;
    private readonly IRepository<StatePartRecord> _stateRepository;
    private readonly IContentDefinitionManager _contentDefinitionManager;
    public AddressService(IContentManager contentManager, IOrchardServices orchardService, IRepository<StatePartRecord> stateRepository, IContentDefinitionManager contentDefinitionManager)
    {
        _contentManager = contentManager;
        _orchardService = orchardService;
        _stateRepository = stateRepository;
        _contentDefinitionManager = contentDefinitionManager;
    }
...
}

public interface IAddressService : IDependency    { ... }

我的问题是,在我的自定义类中,这只是一个简单的类,如何在其中解析和创建服务类的对象实例?

我的简单课程:

public class MyClass
{

   public SomeMethod() 
   {
      var addressService = // a method to resolve 'AddressService' class from IOC container

      // Do somthing with 'addressService' ...
   }
}

编辑我已经知道我们可以通过注入方式使用AddressService,但在某些情况下我无法使用注入,例如static classesextension method ...,因为我需要动态解决AddressService并通过某种方法创建实例(我猜它会在Orchard Framework中找到),我必须使用它。

实际上我需要一个方法,它接受一个Type作为参数并创建传递的Type的实例并返回创建的对象。

4 个答案:

答案 0 :(得分:2)

你没有。你的类本身必须通过某种东西来实例化。注入其他东西时应该进行实例化。应该修改这个问题,以提供一个真实的例子,而不是“你好世界如果”的情景。

答案 1 :(得分:2)

为什么不将您的其他课程注册到Autofac容器中呢?然后你可以让你的容器照顾你的班级。引用由Autofac管理的服务并不是一个很好的主意。应将服务注入管理的控制器。如果您需要结合服务功能,只需在另外的服务中执行此操作....

否则,您需要引用Autofac Container,然后调用Resolve方法。那么,你怎么做到的?您可以在DefaultContentManager中查看如何通过IComponentContext解析组件,但当然DefaultContentManager由Autofac管理,我在Orchard中找不到静态方法将允许您获取对Autofac容器的引用(如果它是OrchardStarter中的静态getter。)

答案 2 :(得分:1)

将参数(服务)传递给实现接口的构造函数。然后你应该能够访问该服务(IOC排序实例化等):

public class MyClass
{
   private IAddressService addressService;
   public MyClass(IAddressService service) 
   {
      addressService = service;    
   }

   public SomeMethod() 
   {
      // Do something with 'addressService' ...
   }
}

或者你的问题不像我所理解的那样明显吗?

在你的问题的五读时,我想你可能会问如何注册你的界面以便它使用你的实现?

不确定Ioc是如何在Orchard中完成的,但是在Windsor(我在工作中使用)中我们注册了类似于此的依赖项:

public class MyClass
{
  public SomeMethod(IWindsorContainer container)
  {
     container.Register( Component.For<IAddressService>().ImplementedBy<AddressService>());
  }
}

编辑:在代码中犯了错误,因此添加了构造函数,而不是将值传递给方法。

答案 3 :(得分:0)

我使用IWorkContexAccessor解决了问题。 You can see code here.