3

我在 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 classesor extension method... ,因为我需要动态解析AddressService并通过某种方法创建实例(我猜它会是在 Orchard Framework 中找到)我必须使用它。

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

4

4 回答 4

2

你没有。您的类本身必须由某些东西实例化。它应该在注入其他东西时被实例化。应该修改这个问题以呈现一个真实的例子,而不是一个“你好世界假设”的场景。

于 2012-08-16T07:10:52.320 回答
2

为什么不把你的其他类也注册到 Autofac 容器中呢?然后你可以让你的容器负责连接你的类。引用由 Autofac 管理的服务注入到非类中并不是一个好主意。服务应该被注入到被管理的控制器中。如果您需要组合服务功能,只需创建另一个可以执行此操作的服务....

否则,您需要对 Autofac 的引用Container,然后调用该Resolve方法。那么,你是怎么得到的呢?您可以查看在通过 解析组件的位置是如何完成的DefaultContentManagerIComponentContext但当然DefaultContentManager是由 Autofac 管理的,并且我在 Orchard 中找不到可以让您获得对 Autofac 容器的引用的静态方法(如果有的话)将是 ) 中的静态吸气剂OrchardStarter

于 2012-08-16T08:31:38.447 回答
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>());
  }
}

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

于 2012-08-16T09:50:33.340 回答
0

我使用 IWorkContexAccessor 解决了。 你可以在这里看到代码。

于 2014-04-03T13:26:25.247 回答