3

我在烏節CMS的一個模塊中有一個服務類,它依賴於一些依賴,如IContentManager和它實現的IDependency接口。 在我的控制器中,我通過注入使用它,它工作得很好。如何解決Orchard CMS中的對象?

我的服務:

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的實例並返回創建的對象。

+0

是否適合您創建靜態方法,以便它將服務的結果作爲參數並返回您需要的任何對象?然後你可以在控制器中調用服務返回你的對象,將它傳遞給你的靜態擴展和vuala ...你創建了什麼樣的擴展? – Eduard 2012-08-23 09:12:39

回答

1

將參數(服務)傳遞到實現接口的構造函數中。然後,你應該能夠訪問服務(IOC梳理實例等):

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

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

或者是你的問題,不是因爲我已經明白它是那麼明顯?

對你的問題進行五讀時,我想你可能會問如何註冊你的接口,以便它使用你的實現?

不知道國際奧委會如何在烏節路,但在溫莎(我在工作中使用),我們註冊了類似這樣的依賴關係做:

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

編輯:製成的,而不是通過錯誤的代碼,以便增加構造,對該方法的價值。

+0

謝謝man.I've編輯我的問題,我添加了一些問題的更多細節。 – 2012-08-16 10:38:28

+0

這是不正確的果園不使用城堡爲國際奧委會使用Autofac。您也沒有提供如何訪問Orchard IOC容器的方法。 – Eduard 2012-08-16 11:10:51

+0

我已經說過我不確定哪一個IOC Orchard使用。 – 2012-08-16 13:11:17

2

你不知道。你的類本身必須通過某些東西來實例化。它應該在注入其他東西時被實例化。應該修改這個問題來提供一個真實的例子,而不是一個「hello world what if」場景。

+0

感謝您的回覆,我修改了我的問題以便清楚。 – 2012-08-16 07:19:03

2

爲什麼不能將您的其他課程註冊到Autofac容器中?然後,你可以讓你的容器照顧你的班級。它不適合引用由Autofac管理的服務,而不是注入類。應該將服務注入到管理的控制器中。如果您需要結合服務功能,只需製作另一項服務即可執行此操作....

否則,您需要參考Autofac Container,然後調用Resolve方法。那麼,你如何得到這個?您可以看看DefaultContentManager中的組件是如何完成的,其中組件是通過IComponentContext解析的,但當然DefaultContentManager由Autofac管理,並且在Orchard中沒有找到可以讓您獲得對Autofac容器的引用的靜態方法(if有在OrchardStarter這將是一個靜態吸氣劑)。

+0

+1一個體面的解釋 – 2012-08-23 08:58:31