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 回答