Le type Chaîne de caractères ne peut pas être construit. Vous devez configurer le conteneur pour la fourniture de cette valeur
J'ai regardé plusieurs tutos et stackoverflow des questions sur la façon de mettre en œuvre l'unité pour un MVC 5 projet, mais je n'arrive pas à sortir de cette erreur :
Le type Chaîne de caractères ne peut pas être construit. Vous devez configurer le conteneur pour la fourniture de cette valeur.
J'ai installé le package NuGet l'Unité.Mvc5, et enregistré mon type dans l'unité de config. J'ai également appelé le registre des composants de la méthode dans le unityconfig fichier.
public static class UnityConfig
{
public static void RegisterComponents()
{
var container = new UnityContainer();
//register all your components with the container here
//it is NOT necessary to register your controllers
//e.g. container.RegisterType<ITestService, TestService>();
container.RegisterType<IStateService, StateService>();
DependencyResolver.SetResolver(new UnityDependencyResolver(container));
}
}
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RouteConfig.RegisterRoutes(RouteTable.Routes);
UnityConfig.RegisterComponents();
}
public class StateController : Controller
{
private readonly IStateService stateService;
public StateController(IStateService stateService)
{
this.stateService = stateService;
}
//GET: /State/
public ActionResult Index()
{
return View(stateService.GetStates());
}
}
public interface IStateService : IDisposable
{
IEnumerable<State> GetStates();
}
public class StateService : IStateService
{
private MyAppDbContext context;
public StateService() : this(new MyAppDbContext()){}
public StateService(MyAppDbContext context)
{
this.context = context;
}
private IQueryable<State> All()
{
return context.States;
}
public IEnumerable<State> GetStates()
{
return this.All().ToList();
}
public void Dispose()
{
context.Dispose();
}
}
Ici est la trace de la pile:
[InvalidOperationException: The type String cannot be constructed. You must configure the container to supply this value.]
Microsoft.Practices.ObjectBuilder2.DynamicMethodConstructorStrategy.GuardTypeIsNonPrimitive(IBuilderContext context) +311
Microsoft.Practices.ObjectBuilder2.DynamicMethodConstructorStrategy.PreBuildUp(IBuilderContext context) +229
Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext context) +274
Microsoft.Practices.ObjectBuilder2.DynamicMethodBuildPlanCreatorPolicy.CreatePlan(IBuilderContext context, NamedTypeBuildKey buildKey) +162
Microsoft.Practices.ObjectBuilder2.BuildPlanStrategy.PreBuildUp(IBuilderContext context) +245
Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext context) +274
Microsoft.Practices.ObjectBuilder2.BuilderContext.NewBuildUp(NamedTypeBuildKey newBuildKey) +250
Microsoft.Practices.Unity.ObjectBuilder.NamedTypeDependencyResolverPolicy.Resolve(IBuilderContext context) +101
lambda_method(Closure , IBuilderContext ) +215
Microsoft.Practices.ObjectBuilder2.c__DisplayClass1.b__0(IBuilderContext context) +71
Microsoft.Practices.ObjectBuilder2.DynamicMethodBuildPlan.BuildUp(IBuilderContext context) +42
Microsoft.Practices.ObjectBuilder2.BuildPlanStrategy.PreBuildUp(IBuilderContext context) +333
Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext context) +274
Microsoft.Practices.ObjectBuilder2.BuilderContext.NewBuildUp(NamedTypeBuildKey newBuildKey) +250
Microsoft.Practices.Unity.ObjectBuilder.NamedTypeDependencyResolverPolicy.Resolve(IBuilderContext context) +101
lambda_method(Closure , IBuilderContext ) +205
Microsoft.Practices.ObjectBuilder2.c__DisplayClass1.b__0(IBuilderContext context) +71
Microsoft.Practices.ObjectBuilder2.DynamicMethodBuildPlan.BuildUp(IBuilderContext context) +42
Microsoft.Practices.ObjectBuilder2.BuildPlanStrategy.PreBuildUp(IBuilderContext context) +333
Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext context) +274
Microsoft.Practices.ObjectBuilder2.BuilderContext.NewBuildUp(NamedTypeBuildKey newBuildKey) +250
Microsoft.Practices.Unity.ObjectBuilder.NamedTypeDependencyResolverPolicy.Resolve(IBuilderContext context) +101
lambda_method(Closure , IBuilderContext ) +209
Microsoft.Practices.ObjectBuilder2.c__DisplayClass1.b__0(IBuilderContext context) +71
Microsoft.Practices.ObjectBuilder2.DynamicMethodBuildPlan.BuildUp(IBuilderContext context) +42
Microsoft.Practices.ObjectBuilder2.BuildPlanStrategy.PreBuildUp(IBuilderContext context) +333
Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext context) +274
Microsoft.Practices.Unity.UnityContainer.DoBuildUp(Type t, Object existing, String name, IEnumerable`1 resolverOverrides) +383
[ResolutionFailedException: Resolution of the dependency failed, type = "MyApp.MVC.Controllers.StateController", name = "(none)".
Exception occurred while: while resolving.
Exception is: InvalidOperationException - The type String cannot be constructed. You must configure the container to supply this value.
-----------------------------------------------
At the time of the exception, the container was:
Resolving MyApp.MVC.Controllers.StateController,(none)
Resolving parameter "stateService" of constructor MyApp.MVC.Controllers.StateController(MyApp.Service.Services.IStateService stateService)
Resolving MyApp.Service.Services.StateService,(none) (mapped from MyApp.Service.Services.IStateService, (none))
Resolving parameter "context" of constructor MyApp.Service.Services.StateService(MyApp.Data.DAL.MyAppDbContext context)
Resolving MyApp.Data.DAL.MyAppDbContext,(none)
Resolving parameter "connectionString" of constructor MyApp.Data.DAL.MyAppDbContext(System.String connectionString, System.Data.Entity.Infrastructure.DbCompiledModel model)
Resolving System.String,(none)
]
Microsoft.Practices.Unity.UnityContainer.DoBuildUp(Type t, Object existing, String name, IEnumerable`1 resolverOverrides) +446
Microsoft.Practices.Unity.UnityContainer.DoBuildUp(Type t, String name, IEnumerable`1 resolverOverrides) +50
Microsoft.Practices.Unity.UnityContainer.Resolve(Type t, String name, ResolverOverride[] resolverOverrides) +48
Microsoft.Practices.Unity.UnityContainerExtensions.Resolve(IUnityContainer container, Type t, ResolverOverride[] overrides) +61
Unity.Mvc5.UnityDependencyResolver.GetService(Type serviceType) +140
System.Web.Mvc.DefaultControllerActivator.Create(RequestContext requestContext, Type controllerType) +87
[InvalidOperationException: An error occurred when trying to create a controller of type 'MyApp.MVC.Controllers.StateController'. Make sure that the controller has a parameterless public constructor.]
System.Web.Mvc.DefaultControllerActivator.Create(RequestContext requestContext, Type controllerType) +247
System.Web.Mvc.DefaultControllerFactory.GetControllerInstance(RequestContext requestContext, Type controllerType) +438
System.Web.Mvc.DefaultControllerFactory.CreateController(RequestContext requestContext, String controllerName) +257
System.Web.Mvc.MvcHandler.ProcessRequestInit(HttpContextBase httpContext, IController& controller, IControllerFactory& factory) +326
System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object state) +157
System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext, AsyncCallback callback, Object state) +88
System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData) +50
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +301
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155
Quoi pourrais-je fait de mal?
Mise à JOUR
J'ai ajouté le code suivant à la RegisterComponents méthode dans le UnityConfig classe et il semble fonctionner:
container.RegisterInstance<StateService>(new StateService());
Aucun des tutoriels montrent un besoin, et je pense que mon exemple de cas que je l'utilise assez standard. Pourquoi aurais-je besoin de cette ligne? Je ne sais pas trop à propos de l'Unité, de sorte que c'est pourquoi je suis toujours curieux.
J'ai juste ajouté la trace de la pile, mais il se produit dans le StateController.
Quel est le code pour StateService ressembler?
ce travail parce que vous êtes forçant l'Unité à utiliser le StateService sans ctor paramètres. Par défaut, DI conteneurs sont cupides et prendra le ctor avec la plupart des paramètres. Dans votre cas, l'un avec le contexte EF qui va échouer.
Il fait fonctionne bien, parce que le contexte ctor que je veux vraiment utiliser est le vide. Le vide ctor passe ma chaîne de connexion (qui provient d'une classe statique) à la base ctor acceptant un paramètre(chaîne connectionString). Je pense que je vais juste revenir à la façon dont je l'ai eu au premier abord, et supprimer ctors qui acceptent des paramètres, depuis que je suis, de ne pas les utiliser de toute façon. Ils ont été générés à partir de l'EF POCO générateur. Merci pour votre aide!
OriginalL'auteur user2023116 | 2015-09-25
Vous devez vous connecter pour publier un commentaire.
Votre StateService est en train d'essayer de résoudre "contexte". Je vous recommande de garder votre contexte de la DI mappages afin de le garder hors de constructeurs que vous voulez résoudre.
par défaut, l'Unité enregistre tous les types de sorte qu'il essaie de créer une instance de
MyAppDbContext
(comme il est implicitement inscrit) lors de l'appel deStateService(MyAppDbContext context)
. Je supposeMyAppDbContext
a une chaîne de caractères en paramètre pour le constructeur (et donc ne parviennent pas à résoudre).Comment puis-je garder mon contexte de ma DI mappages s'il est implicitement inscrite? Dois-je injecter une interface de mon contexte?
règle générale: ne pas injecter quoi que ce soit dans votre constructeurs, sauf si c'est une interface. Supprimer "MyAppDbContext contexte" à partir de votre StateService ctor et ça devrait être bon. Si vous avez besoin de votre contexte, l'utiliser comme ici: msdn.microsoft.com/en-ca/data/jj729737.aspx. en gros, ne pas injecter votre contexte EF parce que c'est une boîte de pandore. le garder caché dans vos services.
vous devriez poser la question sur qui. Aussi avant de le faire, assurez-vous de comprendre la durée de vie de chaque dépendance impliqués (comme "je veux contexte de vivre pour une seule requête web").
OriginalL'auteur vidalsasoon
Je n'ai pas vu cette réponse n'importe où, donc je voulais ajouter aussi. Ce à quoi il ressemble pour moi, c'est que vous avez plusieurs constructeurs sur votre StateService objet. Ainsi, l'Unité est de choisir le constructeur avec la plupart des paramètres (comme cela a été mentionné dans les commentaires).
Vous appelez dire l'Unité qui constructeur à utiliser à l'aide de InjectionConstructor.
Ci-dessous indique pour utiliser le constructeur sans paramètre.
container.RegisterType<IStateService, StateService>(new InjectionConstructor());
ou vous pouvez aussi lui dire d'utiliser un avec un type bien.
Cela va vous forcer l'Unité à utiliser le constructeur que vous voulez.
OriginalL'auteur Cory