2010-11-02 5 views
7

Je ne comprends pas pourquoi je reçois "Ninject.ActivationException: Erreur Activation de la chaîne Aucune liaison correspondante n'est disponible, et le type n'est pas auto-lisible" dans les liaisons aléatoires. Si je laisse la liaison pour IMedia en place, elle lancera l'exception ActivationException, mais si j'utilise CallbackProvider, cela fonctionne. Toutes ces classes sont structurées de la même manière avec quelques propriétés différentes. Je suis confus quant à pourquoi ILocationType, IMedia et IFarmDataContext lancent ActivationException alors que les autres ne le font pas. Des idées?Ninject 2.1 ActivationException: Erreur lors de l'activation de la chaîne

/****************************** 
* Core Types 
******************************/ 
Bind<IFarmDataContext>().ToProvider(new CallbackProvider<IFarmDataContext>(delegate { return new FarmDataContext(); })); 

//Media 
Bind<IMedia>().To<Media>(); //blows up 
//Bind<IMedia>().ToProvider(new CallbackProvider<IMedia>(delegate { return new Media(); })); 
Bind<IMediaType>().To<MediaType>(); 
Bind<IMediaRelated>().To<MediaRelated>(); 

//Location 
Bind<ILocation>().To<Location>(); 
Bind<ILocationType>().ToProvider(new CallbackProvider<ILocationType>(delegate { return new LocationType(); })); 
Bind<ILocationDetail>().To<LocationDetail>(); 
+0

Pouvez-vous également publier l'interface IMedia et l'implémentation multimédia? – Freshblood

Répondre

4

Ninject n'a pas de liaison pour la touche « chaîne » pour injecter dans le .ctor des médias; Lorsqu'il essaye de créer un type qui dépend de Media, il ne sait pas comment résoudre la dépendance et lance. Pour la plupart des types, Ninject essaierait de créer quelque chose pour vous, mais les types chaîne et valeur ne sont pas auto-liables car nous n'avons pas une bonne valeur par défaut et cela peut causer des ravages sur les types utilisant des conventions différentes avec les primitives.

Vous devez ajouter une valeur de paramètre dans vos liaisons (.WithContructorArgument ("key", someValue)) ou utiliser un type de fournisseur (ce que vous avez fait).

0

Voici l'interface IMedia et l'implémentation multimédia. Media est une classe partielle avec la classe primaire générée via un fichier DBML LinqToSql. C'est le cas pour tous les types listés ci-dessus dans la liste des liaisons.

public interface IMedia : IValidationDictionary, IBaseDescriptor { 

    /// <summary> 
    /// Returns a specific Media object specifying 
    /// if you want the full or lite version 
    /// </summary> 
    /// <param name="id"></param> 
    /// <param name="isLite"></param> 
    /// <param name="context"></param> 
    /// <returns></returns> 
    IMedia Get(long id, bool isLite, DataContext context); 

    /// <summary> 
    /// Returns the lite version of the request Media object 
    /// </summary> 
    /// <param name="id"></param> 
    /// <param name="context"></param> 
    /// <returns></returns> 
    IMedia Get(long id, DataContext context); 

    /// <summary> 
    /// Returns a list of Media Objects 
    /// </summary> 
    /// <param name="isLite"></param> 
    /// <param name="context"></param> 
    /// <returns></returns> 
    ValidationList<IMedia> List(bool isLite, DataContext context); 

    /// <summary> 
    /// Returns a list of Media Objects with pagination capabilities 
    /// </summary> 
    /// <param name="isLite"></param> 
    /// <param name="skip"></param> 
    /// <param name="top"></param> 
    /// <param name="context"></param> 
    /// <returns></returns> 
    ValidationList<IMedia> List(bool isLite, int skip, int top, DataContext context); 

} 

public partial class Media : BaseDescriptor, IMedia { 

    #region Constructors 

    public Media(String key, IError error) 
     : base() { 
     AddError(key, error); 
    } 

    #endregion 

    #region Properties 

    public MediaType Type { 
     set { if (TypeID <= 0) { MediaType = value; } } 
     get { return MediaType; } 
    } 

    #endregion 

    #region Internal Methods 

    /// <summary> 
    /// Truncates relationships as appropriate to reduce over-the-wire size 
    /// </summary> 
    protected override void MakeLite() { 
     MediaRelateds = new EntitySet<MediaRelated>(); 
    } 

    /// <summary> 
    /// Validates the values and returns true if there are no problems. 
    /// </summary> 
    override public bool Validate() { 
     this.ClearErrors(); 
     if (this.TypeID <= 0) { this.AddError("TypeID", new Error(ErrorType.VALIDATION, "TypeID is missing or invalid")); } 
     if (string.IsNullOrEmpty(this.Path)) { this.AddError("Path", new Error(ErrorType.VALIDATION, "Path is missing or invalid")); } 
     if (this.CreatedOn.Year <= 1900) { this.AddError("CreatedOn", new Error(ErrorType.VALIDATION, "CreatedOn is missing or invalid")); } 
     if (this.CreatedBy <= 0) { this.AddError("CreatedBy", new Error(ErrorType.VALIDATION, "CreatedBy is missing or invalid")); } 
     if (this.UpdatedOn.Year <= 1900) { this.AddError("UpdatedOn", new Error(ErrorType.VALIDATION, "UpdatedOn is missing or invalid")); } 
     if (this.UpdatedBy <= 0) { this.AddError("UpdatedBy", new Error(ErrorType.VALIDATION, "UpdatedBy is missing or invalid")); } 
     if (!string.IsNullOrEmpty(this.Path) && this.Path.Length > 255) { this.AddError("Path", new Error(ErrorType.VALIDATION, "Path is longer than the maximum of 255 characters")); } 
     return (this.ErrorCount == 0); 
    } 
    #endregion 


    #region Public Methods 

    public ValidationList<IMedia> List(bool isLite, DataContext context) { 
     return List(isLite, 0, 0, context); 
    } 

    public ValidationList<IMedia> List(bool isLite, int skip, int top, DataContext context) { 
     if (context == null) { context = new DataContext(); } 
     var query = context.Medias.Where(x => x.DeletedOn == null); 
     List<Media> results; 
     if (skip > 0 || top > 0) { 
      if (top > 0) { 
       if (skip < 0) { skip = 0; } 
       results = query.OrderBy(x => x.ID).Skip(skip).Take(top).ToList(); 
      } else { 
       results = query.OrderBy(x => x.ID).Skip(skip).ToList(); 
      } 
     } else { 
      results = query.OrderBy(x => x.ID).ToList(); 
     } 

     var finalResult = new ValidationList<IMedia>(new List<IMedia>()); 
     foreach (var result in results) { 
      result.IsLite = isLite; 
      finalResult.Source.Add(result); 
     } 
     return finalResult; 
    } 

    public IMedia Get(long id, DataContext context) { 
     return Get(id, false, context); 
    } 

    public IMedia Get(long id, bool isLite, DataContext context) { 
     if (context == null) { context = new DataContext(); } 
     var results = context.Medias.Where(x => x.ID == id && x.DeletedOn == null).ToList(); 
     var result = (results.Count > 0 ? results[0] : null); 
     if (result != null) { 
      result.IsLite = isLite; 
     } 
     return result; 
    } 

    #endregion 

} 
Questions connexes