בעיית הזרקה עם Ninject ו WebApi
אני משתמש ב Ninject באפליקציית WebApi ויש לי בעיה שטחנתי עליה ולא הצלחתי לפתור אותה.
הבעיה היא שאותו Instance של Service מסויים שאני מזריק (נקרא לו IContext), מוזרק לי ב Relosve על אף שהוא ב Scope הדיפולטי שלו Transient.
נניח יש לי שני קלאסים: ClassA ו ClassB שמקבלים IContext ב Ctor שלהם.
בנוסף ClassB מקבל ClassA ב Ctor שלו.
כאשר מתבצע Resolve, נוצר לי Context אחד, והוא מוזרק לי גם ל ClassA וגם לClassB.
את ה IContext אני מייצר מ Provider ואני רואה שהוא נקרא פעמיים, מייצר שני Instaces שונים, אך רק הראשון מוזרק.
אני לא מבצע InRequestScope.
אני מעלה את ה WebCommon ואת ה Bindings.
מה יכולה להיות הבעיה? אני משתגע.
דרך אגב, ה Context הזה זה DBContext ואני רוצה Instance חדש לכל סרביס ופה הוא משותף לי.
אציין שאם ישנה בקשת Http נוספת, אז כמובן Instance אחר יוזרק , אבל עדיין, אותו Instance למספר Services.
תודה רבה.
אני משתמש ב Ninject באפליקציית WebApi ויש לי בעיה שטחנתי עליה ולא הצלחתי לפתור אותה.
הבעיה היא שאותו Instance של Service מסויים שאני מזריק (נקרא לו IContext), מוזרק לי ב Relosve על אף שהוא ב Scope הדיפולטי שלו Transient.
נניח יש לי שני קלאסים: ClassA ו ClassB שמקבלים IContext ב Ctor שלהם.
בנוסף ClassB מקבל ClassA ב Ctor שלו.
כאשר מתבצע Resolve, נוצר לי Context אחד, והוא מוזרק לי גם ל ClassA וגם לClassB.
את ה IContext אני מייצר מ Provider ואני רואה שהוא נקרא פעמיים, מייצר שני Instaces שונים, אך רק הראשון מוזרק.
אני לא מבצע InRequestScope.
אני מעלה את ה WebCommon ואת ה Bindings.
מה יכולה להיות הבעיה? אני משתגע.
דרך אגב, ה Context הזה זה DBContext ואני רוצה Instance חדש לכל סרביס ופה הוא משותף לי.
אציין שאם ישנה בקשת Http נוספת, אז כמובן Instance אחר יוזרק , אבל עדיין, אותו Instance למספר Services.
תודה רבה.
קוד:
private static readonly Bootstrapper bootstrapper = new Bootstrapper();
public static void Start()
{
DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule));
DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule));
bootstrapper.Initialize(CreateKernel);
}
public static void Stop()
{
bootstrapper.ShutDown();
}
private static IKernel CreateKernel()
{
var kernel = new StandardKernel();
CreateServices(kernel);
GlobalConfiguration.Configuration.DependencyResolver = new WebApiNinjectDependencyResolver(kernel);
return kernel;
}
private static void CreateServices(IKernel Kernel)
{
Kernel.Bind<IContext>().ToProvider<ContextProvider>();
}