所以我放弃了“ASP.NET MVC 2 In Action book”中的演示。没有任何真正的理由只是玩它。我试图用一个真正的IOC容器实现一个例子(他们在示例代码中使用的那个是假的,当然会工作)。我遇到的问题是MakeGenericType返回一个奇怪的类型,名称后面有一个勾号1。我查看了这个问题What does a backtick in a type name mean in the Visual Studio debugger?,这似乎表明它仅用于显示目的?但它似乎并不那样。这是我的代码。
//here are the ways I tried to register the types
private static void InitContainer()
{
if (_container == null)
{
_container = new UnityContainer();
}
_container.RegisterType<IMessageService, MessageService>();
_container.RegisterType<IRepository, Repository>();
_container.RegisterType(typeof(IRepository<Entity>), typeof(Repository<Entity>));
}
以下是我试图实现的模型绑定器的代码。
public class EntityModelBinder: IFilteredModelBinder
{
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
ValueProviderResult value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
if (value == null)
return null;
if (string.IsNullOrEmpty(value.AttemptedValue))
return null;
int entityId;
if (!int.TryParse(value.AttemptedValue, out entityId))
return null;
Type repoType = typeof (IRepository<>).MakeGenericType(bindingContext.ModelType);
var repo = (IRepository)MvcApplication.Container.Resolve(repoType, repoType.FullName, new ResolverOverride[0]);
Entity entity = repo.GetById(entityId);
return entity;
}
public bool IsMatch(Type modelType)
{
return typeof (Entity).IsAssignableFrom(modelType);
}
}
对container.resolve的调用总是会出现这个错误:
依赖关系的解析失败,type =“MvcModelBinderDemo.IRepository`1 [MvcModelBinderDemo.Entity]”,name =“MvcModelBinderDemo.IRepository`1 [[MvcModelBinderDemo.Entity,MvcModelBinderDemo,Version = 1.0.0.0,Culture = neutral,公钥=空]]”。 在解决时发生异常。
另外 - 我确实知道将MvcApplication的引用放在ModelBinder中有点草率,只是试图找出工作方式和进入容器所需的工作方式。
感谢您的任何意见。
答案 0 :(得分:1)
我认为问题在于您在Resolve
中明确指定了名称。请尝试删除第二个参数repoType.FullName
。
尝试使用MvcApplication.Container.Resolve(repoType);
。不要忘记在* .cs文件的顶部添加using Microsoft.Practices.Unity;
。
在您关联的问题中已经回答了反引号的含义。但是,你的结论是不正确的。它不仅仅用于显示目的。带反引号的名称是您班级的CLR名称 这不是你问题的根源。