私は 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 のパッケージを含めましたが、これはバージョンの問題でしょうか?