Unité: Impossible d'enregistrer le type de montage différent
Je suis en train de mettre en œuvre Dependency injection
dans mon application MVC. Je suis en utilisant Unity.Mvc3.dll
pour le Cio. Je me demandais comment l'Unité ne peut pas enregistrer les Types à partir d'une autre assemblée. Voici le code:
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
var container = new UnityContainer();
//ok: register type from this assembly
container.RegisterType<IMessages, Messages>();
//fail: register type from another assembly (service reference)
container.RegisterType<IPlayerService, PlayerService>();
DependencyResolver.SetResolver(new UnityDependencyResolver(container));
}
public class UnityDependencyResolver : IDependencyResolver
{
private readonly IUnityContainer _container;
public UnityDependencyResolver(IUnityContainer container)
{
this._container = container;
}
public object GetService(Type serviceType)
{
try
{
return _container.Resolve(serviceType);
}
catch (Exception ex)
{
throw ex;
}
}
public IEnumerable<object> GetServices(Type serviceType)
{
try
{
return _container.ResolveAll(serviceType);
}
catch (Exception ex)
{
throw ex;
}
}
}
Utilisation dans le MVC Contrôleur:
[Dependency]
public IPlayerService PlayerService { get; set; }
[Dependency]
public IMessages Messages { get; set; }
public ActionResult Index()
{
PlayerMessageViewModel vm = new PlayerMessageViewModel();
vm.Messages = Messages; //success!
vm.Players = PlayerService.Get(); //fail: null reference exception :PlayerService
return View(vm);
}
PlayerService
est toujours nulle, tandis que le Messages est OK.
Ici est la PlayerService
Classe
public class PlayerService : IPlayerService
{
private readonly MyDbEntities _dbContext;
public PlayerService()
{
_dbContext = new MyDbEntities();
}
public PlayerService(MyDbEntities dbContext)
{
_dbContext = dbContext;
}
public IQueryable<Player> Get()
{
return _dbContext.Players.AsQueryable();
}
}
c'est le Message d'Erreur
Résolution de la dépendance à l'échec, type = "System.Web.Mvc.IControllerFactory", nom = "(aucun)".
Exception s'est produite lors: lors de la résolution d'.
Exception: exception InvalidOperationException - Le type de courant, Système.Web.Mvc.IControllerFactory, est une interface ne peut pas être construit. Êtes-vous manque un type de la cartographie?
OriginalL'auteur lincx | 2012-06-12
Vous devez vous connecter pour publier un commentaire.
Par défaut de l'unité choisit le constructeur avec la plupart des paramètres, donc je pense que c'est d'essayer d'utiliser le deuxième constructeur avec la dbContext paramètre, il ne peut pas résoudre. Si vous marquez votre constructeur par défaut avec l'attribut [InjectionConstructor] alors j'espère que ça va résoudre votre problème
ce que la bibliothèque InjectionConstructor attribut est-il inclus?
msdn.microsoft.com/en-us/library/...
toujours pas de chance, j'ai même retiré la surcharge ctor mais en vain
Je ne pense pas qu'il n'y a pas de travail avec celui-ci, Comment l'autre est mis en oeuvre avec des services WCF types.
OriginalL'auteur Fergus Bown
Vous vous cachez toutes les exceptions avec
catch { return null; }
essayer de l'enlever et de voir ce que l'exception est levée lors de la résolution. Je pense que l'exception est levée dansPlayerService
constructeur.EDIT:
De http://mvchosting.asphostcentral.com/post/ASPNET-MVC-3-Hosting-Problem-in-implementing-IControllerActivator-in-ASPNET-MVC-3.aspx
Ouais,
public PlayerService()
- Je supprimer le null et remplacer jeter l'exception et c'est ce que je reçois
the current type, System.Web.Mvc.IControllerFactory, is an interface and cannot be constructed. Are you missing a type mapping?
Est-il quelque chose de mal dans le Service de Joueur? Je ne pense pas que c'est dans le MyDbEntities qui est une Entité Cadre edmx
veuillez voir mon Edit.
OriginalL'auteur Pavel Krymets
Vous violer le contrat de
IDependencyResolver
. Il doit retournernull
pour les types qui ne peuvent pas être résolus. Le problème avec l'Unité, c'est qu'il essaie de construire toutes les classes qu'il peut trouver, peu importe si elles sont déposées dans le conteneur ou pas.Donc une classe quelque part ne peut pas être construit.
Il y a aussi un
Unity.Mvc3
paquet nuget.c'est en fait à l'origine renvoie la valeur null, mais je viens de remplacer throe exception à voir l'erreur, comme suggéré par les autres affiches.
Votre
throw
cache le problème que vous avez obtenu depuis le début, depuisIControllerActivator
est invoquée avant toute contrôleur est invoquée. Revenir à retourner la valeur null et un JOURNAL de toutes les exceptions (ou placez un point d'arrêt dans le bloc catch)Continuer à revenir
null
pour tous ASP.NET/MVC3 les classes jusqu'à ce que le contrôleur est appelé. C'est cette exception qui nous intéresse.Je vous ai aidé à trouver la réponse, mais vous avez accepté une autre réponse?
Hence a class somewhere can not be built
OriginalL'auteur jgauffin
Le type de courant, (EX-DI.IBLL.IEmployee), est une interface ne peut pas être construit. Êtes-vous manque un type de la cartographie?
Ans - Juste en
Unity.config.cs
ajouter le suivant thyeOriginalL'auteur Debendra Dash