0

メイン プロジェクトで具象型ライブラリを参照しないようにしていますが、次のエラーが発生します。

No default instance or named instance 'Default' for requested plugin type StackExchangeChatInterfaces.IClient
1.) Container.GetInstance(StackExchangeChatInterfaces.IClient ,{username=; password=; defaultRoomUrl=; System.Action`2[System.Object,System.Object]=System.Action`2[System.Object,System.Object]})

次のように、アセンブリをスキャンするようにコンテナーをセットアップしました。

        var container = new Container(x =>
        {
            x.Scan(scan =>
            {
                scan.AssembliesFromApplicationBaseDirectory();
                scan.ExcludeNamespace("StructureMap");
                scan.WithDefaultConventions();
                scan.AddAllTypesOf<IMessageHandlers>();
            });
            //x.For<IClient>().Use<Client>(); //GetInstance will work if this line is not commented out.
        });

インスタンスを取得しようとすると、エラーが発生します。インスタンスを取得するためのコードは次のとおりです。

chatInterface = container
    .With("username").EqualTo(username)
    .With("password").EqualTo(password)
    .With("defaultRoomUrl").EqualTo(roomUrl)
    .With<Action<object, object>>(delegate(object sender, object messageWrapper)
        {
            string message = ((dynamic)messageWrapper).Message;
            Console.WriteLine("");
            Console.WriteLine(message);
            foreach (var item in messageHandlers)
            {
                item.MessageHandler.Invoke(message, chatInterface);
            }                        
        }).GetInstance<IClient>();

具象クラスをインターフェイスに明示的にマップすると、すべてがうまく機能しますが、それClientは、私がやりたくないプロジェクトを参照する必要があることを意味します。

4

2 に答える 2

2

これは本当に興味深いです。デフォルトの規則では、そのようなコンストラクターで型を登録できないようです (バージョン 2.6.3 と 3+ の両方で試しました)。パラメーターなしのコンストラクターのみが指定された場合にのみ登録されました。両方のバージョンのソースを見ると、登録する必要があるため、本当に疑わしいです。コードをさらに深く掘り下げる必要があります...

とにかく、カスタム登録規則を使用してみてください:

public class ClientConvention : IRegistrationConvention
{
    public void Process(Type type, Registry registry)
    {
        if (type.IsClass && !type.IsAbstract && !type.IsGenericType &&
            type.GetInterfaces().Contains(typeof(IClient)))
        {
            registry.For(typeof(IClient)).Use(type);
        }
    }
}

次のように構成します。

    var container = new Container(
            c => c.Scan(
                s =>
                    {
                         s.ExcludeNamespace("StructureMap");
                         s.WithDefaultConventions();
                         s.Convention<ClientConvention>();
                         s.AddAllTypesOf<IMessageHandlers>();
                    }));

これは問題なく動作するはずです。

于 2014-12-08T18:38:54.233 に答える
0

デフォルトの型スキャンでは、コンストラクター関数に文字列、数値、日付などのプリミティブ引数が含まれる具象型は検出されません。とにかく、これらのインライン依存関係を明示的に構成する必要があると考えられます。

「しかし、それはクライアントが参加しているプロジェクトを参照する必要があることを意味しますが、これはやりたくありません。」

  • それは実際に問題ですか?アセンブリ参照を排除しようとすることで、物事を必要以上に難しくしていると思います。
于 2014-12-12T17:32:45.593 に答える