1

私は RESTful サービスを初めて使用し、しばらくの間 IoC を使用してスタックを新たに接続する必要がなかったので、これは私に軽度の脳卒中を与えています。

次のようなWCFサービスがあります(簡略化):

public interface IESIID
{
    [OperationContract]
    [WebGet(UriTemplate = "/{guid}/{id}", ResponseFormat = WebMessageFormat.Json,
        BodyStyle = WebMessageBodyStyle.Wrapped)]
    Message LookupESIID(string guid, string id);
}

public class ESIID : BaseREST<ESI>, IESIID
{
    private readonly ITXESIIDService _bllSvc;

    public ESIID(ITXESIIDService svc)
    {
        _bllSvc = svc;
    }

    public Message LookupESIID(string guid, string id)
    {
        return GetById(guid, id);
    }

    private Message GetById(string guid, string id)
    {
        apiAuthentication = new APIKeyAuthentication();
        if (!apiAuthentication.IsValidAPIKey(guid))
            return APIError();

        //_bllSvc = new TXESIIDService(); <--- WANTING TO AVOID THIS!!!!
        var results = _bllSvc.SelectByID(id);

        return results.Count == 0 ? NoResults() : CreateMessage(results);
    }
 }

わかりました、それはかなり簡単です。BLL TXESIIDService メソッドを呼び出すため、コンストラクター パラメーターを追加しました。

そこで、Ninject のグローバル ファイルを次のように変更しました。

 public class Global : NinjectWcfApplication
{
    protected override void Application_Start(object sender, EventArgs e)
    {
        RegisterRoutes();
    }

    protected override IKernel CreateKernel()
    {
        return new StandardKernel(new RestServiceModel());
    }

    private static void RegisterRoutes()
    {
        RouteTable.Routes.Add(new ServiceRoute("ESIID", new NinjectServiceHostFactory(), typeof(ESIID)));
    }

}

また、私のモジュールを追加しました:

 public class RestServiceModel : NinjectModule
    {
        public override void Load()
        {
            Bind<ITXESIIDService>().To<TXESIIDService>();
            Bind<IDoNotSolicitService>().To<DoNotSolicitService>();
        }
    }

トラブルシューティングのために、独自の NinjectServiceHostFactory で追加しました

 public class NinjectServiceHostFactory : WebServiceHostFactory 
{
    protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
    {
        var serviceTypeParameter = new ConstructorArgument("serviceType", serviceType);
        var baseAddressesParameter = new ConstructorArgument("baseAddresses", baseAddresses);
        return KernelContainer.Kernel.Get<NinjectServiceHost>(serviceTypeParameter, baseAddressesParameter);
    }
}

これを次のように実行すると、次の行のエラーが表示されます。

return KernelContainer.Kernel.Get<NinjectServiceHost>(serviceTypeParameter, baseAddressesParameter);

null にすることはできません。

明らかに、ここで何かが欠けていますが、何がわかりません。この時点でさまざまなことを試しましたが、私が目にするほとんどの例は WCF サービス用であり、私が見つけた RESTful のものは、Ninject や IoC の常連に慣れ親しんだものに少し合わせすぎています。

また、私のビジネス レイヤーとデータ レイヤー (エンティティ フレームワークを使用) では、そこにも Ninject を実装しようとしています。レイヤーを別々に配線するのがベスト プラクティスですか、それともすべてを 1 か所で行うことは可能ですか?

ありがとう。

UPDATE 1 バインディングの問題を修正しましたが、これはまだ私を爆撃します. 私は Ninject.Extensions.Wcf を使用していますが、まったく正しくないように見える NinjectWcfApplication.cs ファイルを探して爆撃しています。NuGet を使用して Ninject のパッケージを含めましたが、これはバージョンの問題でしょうか?

4

3 に答える 3

2

これはタイプミスかもしれませんが、モジュール内でインターフェイスをそれ自体にバインドするつもりですか? 通常、インターフェイスを具象型にバインドします。Ninject がインターフェイス タイプをインスタンス化しようとすると、間違いなく失敗し、Ninject セットアップの特定のエラー処理動作に応じて、null をスローするか、null を返します。したがって、モジュールが実際のクラスを探すように構成されていることを確認してください。

public class RestServiceModel : NinjectModule
    {
        public override void Load()
        {
            Bind<ITXESIIDService>().To<TXESIIDService>();
            ...
        }
    }
于 2011-12-05T21:05:44.507 に答える
2

仮想メソッドをオーバーライドするときは、常に基本メソッドを呼び出す必要があります。を参照してくださいApplication_Start()

于 2011-12-14T17:37:43.750 に答える
0

あなたの更新について: 私は ninject を初めて使用するので、古いバージョンについては何も知りませんが、最初にサンプル Ninject 拡張機能を試してみると思います。それらが実行される場合、それは別のものに違いないことがわかります。

于 2011-12-06T19:01:00.973 に答える