4

asp.netMVC2とNinject2を使用しています。

セットアップはとても簡単です。コントローラは、リポジトリを呼び出すサービスを呼び出します。

私のコントローラーでは、injectを使用してサービスクラスを問題なくインスタンス化します。しかし、サービスクラスはリポジトリをインスタンス化しないため、NullReferenceExceptionが発生します。

public class BaseController : Controller
{
    [Inject]
    public IRoundService roundService { get; set; }
}

これは機能します。しかし、これはしません...

public class BaseService
{
    [Inject]
    public IRoundRepository roundRepository { get; set; }
}

RoundServiceクラスでroundRepositoryを使用しようとすると、NullReferenceExceptionが発生します。

IList<Round> rounds = roundRepository.GetRounds( );

モジュールクラス-

public class ServiceModule : NinjectModule
{
    public override void Load( )
    {
        Bind<IRoundService>( ).To<RoundService>( ).InRequestScope( );
    }
}

public class RepositoryModule : NinjectModule
{
    public override void Load( )
    {
        Bind<IRoundRepository>( ).To<RoundRepository>( ).InRequestScope( );
    }
}

global.axax.csで

protected override IKernel CreateKernel( )
{
        return new StandardKernel( new ServiceModule( ),
            new RepositoryModule( )  );
}
4

1 に答える 1

2

申し訳ありませんが、なぜそれが期待どおりに機能しないのか答えることはできませんが、コンストラクターインジェクションの使用について考えたことはありますか?

これが、Ninject2とASP.NETMVC 2を使用して依存性注入を行う方法であり、コントローラー->サービス->リポジトリなどのチェーン全体で機能します。

オブジェクトのコンストラクターに依存関係があることも私には理にかなっています。これにより、これらの依存関係が非常に目立ち、インスタンス化する必要のある他のオブジェクトから明らかになります。そうしないと、null参照例外が発生する可能性があります...ここにあるようなものです。

HTH、
チャールズ

編集:コメントに応じてコンストラクターを介した基本クラスの注入を表示します。

public class BaseService
{
    public IRoundRepository RoundRepo { get; private set; }

    public BaseService(IRoundRepository roundRepo)
    {
        RoundRepo = roundRepo;
    }
}

public class SquareService : BaseService
{
    public ISquareRepository SquareRepo { get; private set; }

    public SquareService(ISquareRepository squareRepo, IRoundRepository roundRepo)
        : base(roundRepo)
    {
        SquareRepo = squareRepo;
    }
}

これは私のやり方です...他の誰かが別の考え/意見を持っているかもしれません。

于 2010-04-05T05:20:41.827 に答える