我在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 classes
或extension method
...,因为我需要动态解决AddressService
并通过某种方法创建实例(我猜它会在Orchard Framework中找到),我必须使用它。
实际上我需要一个方法,它接受一个Type作为参数并创建传递的Type的实例并返回创建的对象。
答案 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.