3

IContentManagerOrchard CMS のモジュールに、実装されたインターフェイスなどの依存関係に依存するサービス クラスがあり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などの場合には注入を使用できません。そのため、動的に解決し、何らかの方法でインスタンスを作成する必要があります( Orchard Framework にある) を使用する必要がありました。static classesextension methodAddressService

実際、Type を引数として取り、渡された Type のインスタンスを作成し、作成されたオブジェクトを返すメソッドが必要です。

4

4 に答える 4

2

他のクラスもAutofacコンテナに登録してみませんか?次に、コンテナにクラスの配線を任せることができます。Autofacによって管理されているサービスを参照していないクラスに注入するのは良い考えではありません。サービスは、管理対象のコントローラーに注入する必要があります。サービス機能を組み合わせる必要がある場合は、それを実行できる別のサービスを作成してください。

それ以外の場合は、Autofacへの参照が必要です。Containerその後、メソッドを呼び出しますResolve。それで、どうやってそれを得るのですか?DefaultContentManagerコンポーネントが解決される場所でそれがどのように行われるかを見ることができますIComponentContextが、もちろんDefaultContentManagerAutofacによって管理されており、Autofacコンテナへの参照を取得できる静的なメソッドはOrchardにありません(存在する場合)の静的ゲッターになりますOrchardStarter)。

于 2012-08-16T08:31:38.447 に答える
2

あなたはそうしない。クラス自体は、何かによってインスタンス化する必要があります。他の何かに注入されたときにインスタンス化する必要があります。この質問は、「hello world what if」シナリオではなく、実際の例を提示するように変更する必要があります。

于 2012-08-16T07:10:52.320 に答える
1

インターフェイスを実装するコンストラクターに引数 (サービス) を渡します。その後、サービスにアクセスできるはずです (IOC はインスタンス化などをソートします)。

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

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

または、あなたの質問は、私が理解しているほど明白ではありませんか??

あなたの質問を5回目に読んだとき、実装を使用するようにインターフェースを登録する方法を尋ねているのではないかと思いますか?

Orchard で Ioc がどのように行われるかはわかりませんが、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 に答える