激活IAuditRepository时出错没有匹配的绑定可用,并且该类型不可自绑定

时间:2012-04-24 16:50:49

标签: c# wcf dependency-injection inversion-of-control ninject

WCF服务。我第一次尝试使用WCF进行IoC。从Console应用程序调用服务进行测试。有趣的是,我认为这些服务正在运行,所以我用它们来提供数据来测试我正在研究的POC ......我知道我最初还是最终修复了这些服务!

(使用Cassini进行调试)

我正在使用的版本:

  • FluentNHibernate 1.1.0.685
  • NHibernate 2.1.2.4000
  • Ninject 2.2.0.0
  • Ninject.Extensions.Wcf 2.2.0.0
  • .NET Framework 3.5

这是我用作参考的示例之一:Pieter De Rycke's Blog

我在SO上发现的几乎所有帖子都涉及MVC ...我认为我的问题略有不同,因为这是WCF而不是MVC。

例外:

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

Suggestions:
    1) Ensure that you have defined a binding for IAuditRepository.
    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.

控制台应用失败代码: (最后一行失败)

ShotServiceClient shotSvc = new ShotServiceClient();
LookupShotAdministeredRequest request = new LookupShotAdministeredRequest();
request.ClientId = "128";
request.ClinicId = "289";
request.RequestingUserId = "1";
List<ShotsAdministeredContract> shots = shotSvc.LookupShotAdministered(request).ShotsAdministered;

守则:

的Global.asax.cs

public class Global : NinjectWcfApplication
{
    protected override IKernel CreateKernel()
    {
        var modules = new INinjectModule[]
        {
            new NHibernateModule(),
            new ServiceModule(),
            new RepositoryModule()
        };
        return new StandardKernel(modules);
    }
}

NHibernateSessionFactoryProvider.cs

public class NhibernateSessionFactoryProvider : Provider<ISessionFactory>
{
    protected override ISessionFactory CreateInstance(IContext context)
    {
        var sessionFactory = new NhibernateSessionFactory();
        return sessionFactory.GetSessionFactory();
    } 
}

NHibernateSessionFactory.cs

public class NhibernateSessionFactory
{
    public ISessionFactory GetSessionFactory()
    {
        ISessionFactory fluentConfiguration = Fluently.Configure()
            .Database(MsSqlConfiguration.MsSql2008
            .ConnectionString(ConfigurationManager.ConnectionStrings["DefaultConnectionString"].ConnectionString)
            .Cache(c => c
            .UseQueryCache()
            .ProviderClass<HashtableCacheProvider>())
            .ShowSql())
            .Mappings(m => m.FluentMappings.AddFromAssemblyOf<AppointmentMap>()
            .Conventions.AddFromAssemblyOf<PrimaryKeyConvention>())
            .BuildSessionFactory();
        return fluentConfiguration;
    }
}

NHibernateModule.cs

public class NHibernateModule : NinjectModule
{
    public override void Load()
    {
        Bind<ISessionFactory>().ToProvider<NhibernateSessionFactoryProvider>().InSingletonScope();
        Bind<ISession>().ToMethod(context => context.Kernel.Get<ISessionFactory>().OpenSession()).InRequestScope();
    } 
}

RepositoryModule.cs

public class RepositoryModule : NinjectModule
{
    public override void Load()
    {
        Bind<IAuditRepository>().To<AuditRepository>();
        .
        .
        .
        Bind<IShotAdministeredRepository>().To<ShotAdministeredRepository>();
    } 
}

ServiceModule.cs

public class ServiceModule : NinjectModule
{
    public override void Load()
    {
        Bind<IAuditService>().To<AuditService>();
        .
        .
        .
        Bind<IShotService>().To<ShotService>();
    } 
}

NinjectInstanceProvider.cs

public class NinjectInstanceProvider : IInstanceProvider
{
    private Type serviceType;
    private IKernel kernel;

    public NinjectInstanceProvider(IKernel kernel, Type serviceType)
    {
        this.kernel = kernel;
        this.serviceType = serviceType;
    }

    public object GetInstance(InstanceContext instanceContext)
    {
        return this.GetInstance(instanceContext, null);
    }

    public object GetInstance(InstanceContext instanceContext, Message message)
    {
        //Create the instance with your IoC container of choice...here we're using Ninject
        return kernel.Get(this.serviceType);
    }

    public void ReleaseInstance(InstanceContext instanceContext, object instance)
    {
    }
}

NinjectBehaviorAttribute.cs

public class NinjectBehaviorAttribute : Attribute, IServiceBehavior
{
    public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters)
    {
    }

    public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
    {
        Type serviceType = serviceDescription.ServiceType;
        IInstanceProvider instanceProvider = new NinjectInstanceProvider(new StandardKernel(), serviceType);

        foreach (ChannelDispatcher dispatcher in serviceHostBase.ChannelDispatchers)
        {
            foreach (EndpointDispatcher endpointDispatcher in dispatcher.Endpoints)
            {
                DispatchRuntime dispatchRuntime = endpointDispatcher.DispatchRuntime;
                dispatchRuntime.InstanceProvider = instanceProvider;
            }
        }
    }

    public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
    {
    }
}

IAuditRepository.cs

public interface IAuditRepository : IRepository<Audit>
{
}

AuditRepository.cs

public class AuditRepository : Repository<Audit>, IAuditRepository
{
    public AuditRepository(ISession session) : base(session) { }
}

ShotRepository.cs

public class ShotRepository : Repository<Shot>, IShotRepository
{
    public ShotRepository(ISession session) : base(session) { }
}

ShotService.svc.cs

[NinjectBehaviorAttribute]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
public class ShotService : IShotService
{
    #region Members
    private IAuditRepository _auditRepository;
    private IClientRepository _clientRepository;
    private IClinicRepository _clinicRepository;
    private IShotRepository _repository;
    private IShotAdministeredRepository _administeredRepository;
    private IShotCostRepository _costRepository;
    private IUserRepository _userRepository;
    #endregion

    #region Constructors
    public ShotService(IAuditRepository auditRepository, IClientRepository clientRepository, IClinicRepository clinicRepository, IShotRepository repository, IShotAdministeredRepository administeredRepository, IShotCostRepository costRepository, IUserRepository userRepository)
    {
        _auditRepository = auditRepository;
        _clientRepository = clientRepository;
        _clinicRepository = clinicRepository;
        _repository = repository;
        _administeredRepository = administeredRepository;
        _costRepository = costRepository;
        _userRepository = userRepository;
    }
    #endregion

    #region IShotService Members
    .
    .
    .
    public ListAdministeredShotsResponse LookupShotAdministered(LookupShotAdministeredRequest request)
    {
        ListAdministeredShotsResponse response = new ListAdministeredShotsResponse();
        try
        {
            UserService userService = new UserService(_userRepository, _auditRepository);
            User requestingUser = userService.Read(Convert.ToInt32(request.RequestingUserId));
            if (userService.HasPermission(requestingUser, Permissions.ScheduleAppointments))
            {
                ShotAdministeredService service = new ShotAdministeredService(_administeredRepository, _auditRepository);
                //Guts of method go here...irrelevant to current issue
            }
            else
            {
                throw new InvalidPermissionException("Requesting user does not have sufficient permissions to complete the request.");
            }
        }
        catch (Exception ex)
        {
            response.FailureReason = ex.Message;
        }
        return response;
    }
    .
    .
    .
    #endregion
}

我在CreateKernel()中设置了一个断点,它没有被击中。我还在NHibernateModule.cs中的Load()中设置了一个断点,该断点也没有被击中。 &lt; - 更正 ... Cassini“没有响应”所以我想我并没有真正调试我的所有代码。我刚刚在Cassini上完成了一个End Task,并在我的服务上重新运行了调试器......我在CreateKernel()中的断点以及Load()中的断点被击中。我的主要问题仍然存在,但至少我知道这个代码正在执行。

1 个答案:

答案 0 :(得分:2)

您正在使用Ninject.Extensions.Wcf,并且您同时自行集成到Wcf中。有两个内核实例涉及其中一个配置而另一个没有配置。您应该决定使用哪个集成并正确配置该内核。

相关问题