Obtenir une instance d'un objet avec Ninject

J'ai installé sur mon projet Ninject.MVC3 via Nuget.

J'ai lu Cet article {[4] } que pour injecter des dépendances dans mes contrôleurs, tout ce que vous aviez à faire était d'installer Ninject, ajouter mes dépendances dans NinjectMVC3.cs et de prêt.

Jusqu'à présent tout va bien, mais comment récupérer l'instance d'un objet?

public ActionResult MyAction()
{
    var myObject = /* HERE  ??*/
}

Dans le constructeur du contrôleur Je n'ai aucun problème!

public class AccountController : Controller
{
    public AccountController(IRepository repository) { ... } //This works!!
}
21
demandé sur ridermansb 2011-10-11 00:08:51

2 réponses

La raison pour laquelle cela fonctionne est que le ControllerFactory recherche DI et l'ajoute automatiquement. Si vous voulez obtenir une instance spécifique, vous pouvez le faire:

private static void RegisterServices(IKernel kernel) {
    kernel.Bind<ICoolObject>().To(CoolObject);
}

public ActionResult MyAction() {
    var myObject = 
        System.Web.Mvc.DependencyResolver.Current.GetService(typeof (ICoolObject));
}

Attention cependant. Cela se fait assez souvent avec ceux qui sont nouveaux à L'Injection de dépendance (moi inclus). La question est: pourquoi avez-vous besoin de faire de cette façon?

35
répondu Buildstarted 2011-10-10 20:23:20
    protected void Application_Start()
    {
        HttpContext.Current.Application["UnityContainer"] = System.Web.Mvc.DependencyResolver.Current.GetService(typeof(EFUnitOfWork));

        AreaRegistration.RegisterAllAreas();

        WebApiConfig.Register(GlobalConfiguration.Configuration);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);


    }

    public static IRepositoryWrapper IoCSession
    {
        get { return HttpContext.Current.Application["UnityContainer"] as IRepositoryWrapper; }
        set { HttpContext.Current.Application["UnityContainer"] = value; }
    }

BuildStarted j'aime cette façon, s'il y a une autre manière, veuillez nous conseiller.. Riderman vous pouvez utiliser UnitOfWork aussi comme ci-dessous

        var container = new UnityContainer();

        container.RegisterType<IRepositoryWrapper>(new EFUnitOfWork());
0
répondu dewelloper 2013-10-15 22:50:40