特定のクラスタイプのオートファクトスキャンアセンブリ

私はAutofacの使用を開始し、いくつかのDLLをスキャンして、その中のいくつかのクラスを登録するためにAutofacを取得したい。

私が興味を持っているクラスはPluginBaseクラスから継承していますが、以下のコードはそれらを登録していないようです。誰も助けることができますか?

        var assemblies = AppDomain.CurrentDomain.GetAssemblies();


        var builder = new ContainerBuilder();
        builder.RegisterAssemblyTypes(assemblies)
            .Where(t => t.BaseType == typeof(PluginBase))
            .AsImplementedInterfaces()
            .AsSelf();

        var container = builder.Build();
        var pluginClasses = container.Resolve>();

        //pluginClasses is empty!!!!
12

2 答え

私は登録時にあなたのプラグインの基本クラスを指定する必要があると思います。 AsImplementedInterfaces を呼び出すと、その基本型ではなく、実装されたインタフェースで型が登録されます。プラグインをPluginBaseとして登録するには、登録を更新する必要があります。

ここにコードがあります:

var assemblies = AppDomain.CurrentDomain.GetAssemblies();


    var builder = new ContainerBuilder();
    builder.RegisterAssemblyTypes(assemblies)
        .Where(t => t.BaseType == typeof(PluginBase))
        .As();

    var container = builder.Build();
    var pluginClasses = container.Resolve>();
19
追加された
それは動作します!インターフェイスを実装する新しいクラスのAsImplementedInterfacesを追加できますか?
追加された 著者 Jon,
おっと、ちょうど私が書いたことを再読し、意味をなさない。私がPluginBaseから継承するクラスを持っていて、インタフェースのコンストラクタ引数を持っている場合、AsImplementedInterfacesでさえも動作しません。新しいビルダー登録を行っていますか?または私は現在のコードを修正できますか?
追加された 著者 Jon,
RegisterAssemblyTypesをもう一度呼び出すだけで、動作しています。ご協力いただきありがとうございます。
追加された 著者 Jon,
私はこれらの2つの呼び出しが一緒に機能するはずだと思います。次に、タイプはその基本タイプとそれが実装するすべてのインターフェースによって登録されます。
追加された 著者 Jehof,
As を使用する場合、 Where の呼び出しは必要ありません。
追加された 著者 Nicholas Blumhardt,

多分これはこうです:

builder
    .RegisterAssemblyTypes(AppDomain.CurrentDomain.GetAssemblies())
    .Where(t => t.GetInterfaces()
        .Any(i => i.IsAssignableFrom(typeof (IDependency))))
    .AsImplementedInterfaces()
    .InstancePerDependency();

このコードでは、マーカーインターフェイスとして IDependency を使用します。 PluginBase クラスに置き換えて Where メソッドを削除することができます。

要点は、 IsAssignableFrom を使用することです。 a>メソッド。

インタフェースを実装していないクラスとそうでないクラスを許可しますか?私はレガシーコードで作業しているので、古いものはインターフェースを持たないが新しいものは
追加された 著者 Jon,
それは私が恐れていない
追加された 著者 Jon,
それはどちらもうまくいかない。それが役立つならば、PluginBaseは抽象です
追加された 著者 Jon,
元のコードを元に戻し、where句を取り出すだけであれば
追加された 著者 Jon,
はい、そうです。 Jehofさんはどこかにいるようだが、まだ立ち往生している
追加された 著者 Jon,
Where(t => t.IsAssignableFrom(typeof(PluginBase))で動作するはずです。
追加された 著者 Wojteq,
もちろん、 .AsImplementedInterfaces()を削除してください。私はこの行に気付かなかった。
追加された 著者 Wojteq,
現在のAppDomainで PluginBase を拡張しているクラスはありますか?
追加された 著者 Wojteq,