2010-07-05 10 views
0

Comment utiliser Ninject avec un exemple de code pour l'interface et sa mise en œuvre comme ceci:Comment utiliser les constructeurs non-par défaut avec Ninject?

public interface IRepository 
{ 
    // common methods for all content types 
    void Insert(BaseContentObject o); 
    void Update(BaseContentObject o); 
    void Delete(string slug); 
    void Delete(ContentType contentType, string slug); 
    IEnumerable<BaseContentObject> GetInstances(); 
    BaseContentObject GetInstance(ContentType contentType, string slug); 
    BaseContentObject GetInstance(string contentType, string slug); 
    BaseContentObject GetInstance(string slug); 
    IEnumerable<string> GetSlugsForContentType(int limit = 0, string query = ""); 
    ContentList GetContentItems(); 
    bool IsUniqueSlug(string slug); 
    string ObjectPersistanceFolder { get; set; } 
} 

public class XmlDefaultRepository : IRepository 
{ 
    private ContentType SelectedType; 

    public XmlDefaultRepository(string contentType) 
    { 
     SelectedType = (ContentType) Enum.Parse(typeof(ContentType), contentType); 
    } 

    public void Insert(Models.ContentClasses.BaseContentObject o) 
    { 
     throw new NotImplementedException(); 
    } 

    // ... 
} 

public class PageController : BaseController 
{ 
    private IRepository ContentRepository { get; private set; } 

    public PageController(IRepository repository) 
    { 
     ContentRepository = repository; 
    } 

    // 
    // GET: /{slug} 
    // GET: /Pages/{slug} 
    public ActionResult Display(string slug) 
    { 
     // sample repository usage 
     Page page = ContentRepository.GetInstance(slug); 
     // ... 
    } 
} 

Mon code ne contient pas de constructeur par défaut parce que je ne ai pas besoin d'un (même si voulu créer je ne pouvais pas parce que j'Exigez toujours le type de contenu à fournir.

Je ne peux pas faire un constructeur par défaut car il n'y a logiquement pas de type de contenu par défaut à fournir.

C'est l'exception que Ninject produit des lorsque vous essayez de charger mon ASP .NET MVC page

*Error activating string

No matching bindings are available, and the type is not self-bindable.

Activation path:

  1. Injection of dependency string into parameter contentType of constructor of type XmlDefaultRepository
  2. Injection of dependency IRepository into parameter repository of constructor of type PageController
  3. Request for IController

Suggestions:

  1. Ensure that you have defined a binding for string.
  2. If the binding was defined in a module, ensure that the module has been loaded into the kernel.
  3. Ensure you have not accidentally created more than one kernel.
  4. If you are using automatic module loading, ensure the search path and filters are correct.*

Répondre

3

Vous ne devriez pas avoir besoin d'introduire un ctor par défaut juste pour s'il vous plaît Ninject.

En supposant que vous utilisez V2, the semantics for how a constructor is chosen are detailed here

(BTW Par défaut, le type string est pas considéré comme un OOTB de type résoluble, mais vous devriez être en mesure de BindContentTypeTo quelque chose et que le constructeur a invoqué).

Si rien de ce qui précède ne vous aide à bouger, pouvez-vous fournir un scénario d'utilisation et/ou une exception détaillant le problème que vous rencontrez?

EDIT: Il est pas clair pour moi à ce moment que vous êtes certainement dans une situation où vous ne devriez pas être ajoutez un ConstructorArgument ((probablement via WithConstructorArgument() IIRC) à votre déclaration Bind<T>()

+0

J'ai mis à jour mon code. – mare

+0

Si je continue sur le code ci-dessus et le faire dans mon module Ninject Cependant, le fait est que je ne peux pas lier mon paramètre constructeur contentType juste à "Page" dans mon module.Ce paramètre constructeur est dépendant du contrôleur.Dans mon PageController, XmlDefaultRepository être instancié avec une valeur "Page" pour contentType mais dans un autre contrôleur comme un ServiceController, la valeur du paramètre "contentType" doit être égale à "Service". – mare

+0

J'espère que vous comprenez que je ne peux donc pas coder en dur la valeur du paramètre "contentType" dans le module. Comment puis-je résoudre ce problème? Quelle est la chose à propos des usines de contrôleurs, etc.? – mare