【问题标题】:Ninject with ria domainservice standard asp.net webapplicationNinject 与 ria domainservice 标准 asp.net webapplication
【发布时间】:2011-05-25 19:42:30
【问题描述】:

我想将 DI (Ninject) 与我位于标准 asp.net 网络服务器上的 RIA 网络服务一起使用。

我应该如何连接包含数据存储的存储库?

我添加了一个 Global.asax 文件:

    public class Global : NinjectHttpApplication
{
    protected override Ninject.IKernel CreateKernel()
    {
        IKernel kernel = new StandardKernel();
        kernel.Bind<IPersonRepository>().To<PersonRepository>();
        Application.Add("Kernel", kernel);
        return kernel;
    }

这就是我想把它连接起来的地方,但我卡住了

[EnableClientAccess]
public class PersonService : DomainService
{
    IPersonRepository _personRepository;        

    public PersonService()
    {    
             _personRepository = ????....kernel.Get<IPersonRepository>();

    }
}

似乎我只是缺少一种获取应用程序对象然后它会起作用的方法,或者?

【问题讨论】:

    标签: asp.net dependency-injection ninject ria


    【解决方案1】:

    我本身没有 RIA Web 服务的经验,但在快速浏览文档后,我建议执行以下操作。为 Ninject 创建一个 IDomainServiceFactory 的实现。

    public class NinjectDomainServiceFactory : IDomainServiceFactory
    {
        private readonly IKernel _kernel;
    
        public NinjectDomainServiceFactory(IKernel kernel)
        {
            _kernel = kernel;
        }
    
        public DomainService CreateDomainService(
            Type domainServiceType, DomainServiceContext context)
        {
            var service = _kernel.Get(domainServiceType);
            service.Initialize(context);
    
            return service;
        }
    
        public void ReleaseDomainService(DomainService domainService)
        {
            domainService.Dispose();
        }
    
    }
    

    在 Application_Start 中使用DomainService 类注册自定义域服务工厂。

    public void Application_Start(object sender, EventArgs e)
    {
        var kernel = CreateKernel();
        DomainService.Factory = new NinjectDomainServiceFactory(kernel);
    }
    

    确保您向内核​​注册了您的域服务和任何依赖项。 IPersonRepository 应该被注入到 PersonService 的构造函数中。

    [EnableClientAccess]
    public class PersonService : DomainService
    {
        private readonly IPersonRepository _personRepository;        
    
        public PersonService(IPersonRepository personRepository)
        {
            _personRepository = personRepository;
        }
    }
    

    希望这会有所帮助,因为我自己还没有尝试过解决方案。

    【讨论】: