Ошибка Ninject WCF - PullRequest
       8

Ошибка Ninject WCF

2 голосов
/ 26 сентября 2011

Ладно, я в своем уме после того, как нашел эту ошибку за последние два дня:

Error activating IUserIssueRepository
No matching bindings are available, and the type is not self-bindable.
Activation path:
2) Injection of dependency IUserIssueRepository into parameter userIssueRepository of constructor of type IssueTrackerService
1) Request for IssueTrackerService

Suggestions:
1) Ensure that you have defined a binding for IUserIssueRepository.
2) If the binding was defined in a module, ensure that the module has been loaded into the kernel.
3) Ensure you have not accidentally created more than one kernel.
4) If you are using constructor arguments, ensure that the parameter name matches the constructors parameter name.
5) If you are using automatic module loading, ensure the search path and filters are correct.

Я знаю, что мои настройки верны (неповрежденные привязки и т. Д.). Вот соответствующий сервисный сервис wcf. И да, конечно, ссылки на сборки также не повреждены.

Global.asax.cs используя Ninject; используя Ninject.Extensions.Wcf;

namespace NextGenIT.Web.Wcf
{
    public class Global : NinjectWcfApplication
    {
        protected override IKernel CreateKernel()
        {
            return new StandardKernel(new ServiceModule());
        }
    }
}

ServiceModule.cs

using Ninject.Modules;
using NextGenIT.Core.Domain;

namespace NextGenIT.Web.Wcf
{
    public class ServiceModule : NinjectModule
    {
        public override void Load()
        {
            this.Bind<IUserIssueRepository>()
                .To<SqlUserIssueRepository>();
        }
    }
}

IssueTrackerService.svc

<%@
ServiceHost
Factory="Ninject.Extensions.Wcf.NinjectServiceHostFactory"
Service="NextGenIT.Core.Services.IssueTrackerService"
%>

Редактировать 1: трассировка всего стека:

    [FaultException`1: Error activating IUserIssueRepository
No matching bindings are available, and the type is not self-bindable.
Activation path:
  2) Injection of dependency IUserIssueRepository into parameter userIssueRepository of constructor of type IssueTrackerService
  1) Request for IssueTrackerService

Suggestions:
  1) Ensure that you have defined a binding for IUserIssueRepository.
  2) If the binding was defined in a module, ensure that the module has been loaded into the kernel.
  3) Ensure you have not accidentally created more than one kernel.
  4) If you are using constructor arguments, ensure that the parameter name matches the constructors parameter name.
  5) If you are using automatic module loading, ensure the search path and filters are correct.
]
   System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg) +4729827
   System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type) +1725
   NextGenIT.Services.Contracts.IIssueTrackerService.GetUserIssues(String userId) +0
   NextGenIT.Services.Client.IssueTrackerClient.GetUserIssues(String userId) in D:\Projects\TFS\NextGenIssueTracker\branches\2011Updates\NextGenIT.Services.Client\Proxies\IssueTrackerClient.cs:46
   NextGenIT.Tests.Integration.WebClient._default.Page_Load(Object sender, EventArgs e) in D:\Projects\TFS\NextGenIssueTracker\branches\2011Updates\NextGenIT.Tests.Integration.WebClient\default.aspx.cs:26
   System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +25
   System.Web.UI.Control.LoadRecursive() +71
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +3064

Редактирование 2: интерфейс и реализация

IUserIssueRepository.cs

using System.Collections.Generic;
using NextGenIT.Services.Contracts;

namespace NextGenIT.Core.Domain
{
    public interface IUserIssueRepository
    {
        string CreateUser(IUser user);
        int CreateIssue(IIssue issue);
        int CreateComment(IComment comment);
        IUser GetUser(string userId);
        IIssue GetIssue(int issueId);
        IEnumerable<IIssue> GetIssues(string userId);
        IEnumerable<IComment> GetComments(string userId, int issueId);
    }
}

SqlUserIssueRepository.cs

using System.Collections.Generic;
using NextGenIT.Services.Contracts;

namespace NextGenIT.Core.Domain
{
    public class SqlUserIssueRepository : IUserIssueRepository
    {
        public string CreateUser(IUser user) { return "1234"; }
        public int CreateIssue(IIssue issue) { return 1; }
        public int CreateComment(IComment comment) { return 1; }
        public IUser GetUser(string userId) { return null; }
        public IIssue GetIssue(int issueId) { return null; }
        public IEnumerable<IIssue> GetIssues(string userId) { return null; }
        public IEnumerable<IComment> GetComments(string userId, int issueId) { return null; }
    }
}

Ответы [ 2 ]

1 голос
/ 26 сентября 2011

Обновление:

В какой-то момент я переименовал проект, в котором размещается служба WCF. Я никогда не думал проверять разметку global.asax.

Действительно, он наследовал от файла, которого больше не было. Проект скомпилирован без проблем, поэтому я никогда не думал проверять там!

0 голосов
/ 26 сентября 2011

Это может быть вызвано тем, что SqlUserIssueRepository не реализует IUserIssueRepository.

Ninject пытается привязать класс к интерфейсу.

...