Ninject与ria domainservice标准asp.net webapplication

时间:2011-05-25 19:42:31

标签: asp.net dependency-injection ninject ria

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

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

我添加了一个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>();

    }
}

似乎我只是错过了获取应用程序对象的方法然后它可以工作,或者?

1 个答案:

答案 0 :(得分:1)

我本身没有RIA Web Services的经验,但在快速扫描文档后,我建议您执行以下操作。为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);
}

确保使用内核注册域服务和任何依赖项。应该在PersonService的构造函数中注入IPersonRepository。

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

    public PersonService(IPersonRepository personRepository)
    {
        _personRepository = personRepository;
    }
}

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