Nar*_*esh 9 ioc-container unity-container c#-4.0 asp.net-mvc-3
我在trynig加载视图时遇到上述异常.
我正在使用Unity来初始化我的控制器实例.仍然得到上述错误.
这是我的控制器.
public class SiteController : Controller
{
private ISiteRepository _repository;
public SiteController(ISiteRepository repository)
{
_repository = repository;
}
//
// GET: /Site/
public ActionResult Index()
{
return View();
}
//
// GET: /Site/Details/5
public ActionResult Details(int id)
{
return View();
}}
Run Code Online (Sandbox Code Playgroud)
这是我的Global.asax.cs
protected void Application_Start()
{
ConfigApi(GlobalConfiguration.Configuration);
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
static void ConfigApi(HttpConfiguration config)
{
var unity = new UnityContainer();
unity.RegisterType<SiteController>();
unity.RegisterType<ISiteRepository, SiteRepository>(new HierarchicalLifetimeManager());
config.DependencyResolver = new IocContainer(unity);
}
Run Code Online (Sandbox Code Playgroud)
这是我的SiteRepository类.
public class SiteRepository:ISiteRepository
{
private readonly SampleMVCEntities _dbContext;
public SiteRepository()
{
_dbContext = new SampleMVCEntities();
}
private IQueryable<SiteConfig> MapSiteConfig()
{
return _dbContext.SiteConfigs.Select(a => new SiteConfig
{
Name = a.Name,
LinkColour = a.LinkColour,
SiteLogo = a.SiteLogo,
SiteBrands = a.SiteBrands.Select(b => new Models.SiteBrand { SiteId = b.SiteId, BrandId = b.BrandId })
});
}
public IEnumerable<SiteConfig> GetAll()
{
return MapSiteConfig().AsEnumerable();
}}
Run Code Online (Sandbox Code Playgroud)
这是我的错误堆栈.
没有为此对象定义的无参数构造函数.描述:执行当前Web请求期间发生未处理的异常.请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息.
异常详细信息:System.MissingMethodException:没有为此对象定义的无参数构造函数.
来源错误:
在执行当前Web请求期间生成了未处理的异常.可以使用下面的异常堆栈跟踪来识别有关异常的起源和位置的信息.
堆栈跟踪:
[MissingMethodException:没有为此对象定义无参数构造函数.] System.RuntimeTypeHandle.CreateInstance(RuntimeType类型,Boolean publicOnly,Boolean noCheck,Boolean&canBeCached,RuntimeMethodHandleInternal&ctor,Boolean&bNeedSecurityCheck)+0
System.RuntimeType.CreateInstanceSlow(Boolean publicOnly,Boolean skipCheckThis, Boolean fillCache,StackCrawlMark&stackMark)+114
System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly,Boolean skipCheckThis,Boolean fillCache,StackCrawlMark&stackMark)+232 System.Activator.CreateInstance(Type type,Boolean nonPublic)+83 System.Activator.CreateInstance(Type type )+6 System.Web.Mvc.DefaultControllerActivator.Create(RequestContext requestContext,Type controllerType)+55[InvalidOperationException:尝试创建'Config.Controllers.SiteController'类型的控制器时发生错误.确保控制器具有无参数的公共构造函数.]
System.Web.Mvc.DefaultControllerActivator.Create(RequestContext requestContext,Type controllerType)+179
System.Web.Mvc.DefaultControllerFactory.GetControllerInstance(RequestContext requestContext,Type controllerType)+80
System. Web.Mvc.DefaultControllerFactory.CreateController(RequestContext requestContext,String controllerName)+74
System.Web.Mvc.MvcHandler.ProcessRequestInit(HttpContextBase httpContext,IController&controller,IControllerFactory&factory)+197 System.Web.Mvc.<> c_ DisplayClass6.b _2 ()+49 System.Web.Mvc.<> c__DisplayClassb 1 func)+88 System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext,AsyncCallback callback,Object state)+98 System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext) httpContext,AsyncCallback回调,对象状态)+50 System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context,AsyncCallback cb,Object extraData)+16 System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()+268 System.Web.HttpApplication.ExecuteStep(IExecutionStep step,Boolean&completedSynchronously)+1551.<ProcessInApplicationTrust>b__a() +13 System.Web.Mvc.SecurityUtil.<GetCallInAppTrustThunk>b__0(Action f) +7 System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Action action) +22
System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Func
有人能帮助我吗?
谢谢.
nem*_*esv 15
ASP.NET MVC和ASP.NET Web API 使用两个单独的依赖项解析器.
对于源自Controller您的"常规"MVC控制器,您需要使用DependencyResolver.SetResolver:
DependencyResolver.SetResolver(new UnityDependencyResolver(container));
Run Code Online (Sandbox Code Playgroud)
对于派生形式的Wep API控制器,ApiController您需要GlobalConfiguration.Configuration.DependencyResolver在代码中使用as.
因此,如果您计划使用两种类型的控制器,则需要两次注册容器.
有一篇很好的文章如何为依赖项解析器设置Unity:
ASP.NET MVC 4中的依赖注入和使用Unity的WebAPI
| 归档时间: |
|
| 查看次数: |
10994 次 |
| 最近记录: |