我正在使用NInject与NInject.Web.Mvc.
首先,我创建了一个简单的测试项目,我希望IPostRepository在同一Web请求期间在控制器和自定义模型绑定器之间共享一个实例.在我的真实项目中,我需要这个,因为我遇到IEntityChangeTracker问题,我有效地有两个存储库访问相同的对象图.因此,为了简化我的测试项目,我只是想共享一个虚拟存储库.
我遇到的问题是它适用于第一个请求,就是这样.相关代码如下.
NInjectModule:
public class PostRepositoryModule : NinjectModule
{
public override void Load()
{
this.Bind<IPostRepository>().To<PostRepository>().InRequestScope();
}
}
Run Code Online (Sandbox Code Playgroud)
CustomModelBinder:
public class CustomModelBinder : DefaultModelBinder
{
[Inject]
public IPostRepository repository { get; set; }
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
repository.Add("Model binder...");
return base.BindModel(controllerContext, bindingContext);
}
}
public class HomeController : Controller
{
private IPostRepository repository;
public HomeController(IPostRepository repository)
{
this.repository = repository;
}
public ActionResult Index(string whatever)
{
repository.Add("Action...");
return View(repository.GetList());
}
}
Run Code Online (Sandbox Code Playgroud)
Global.asax中: …
asp.net-mvc dependency-injection ninject model-binding custom-model-binder
我目前正在使用Ninject作为我的DI工作的MVC 3项目,业务对象存储在一个单独的程序集中.我遇到了控制器参数的问题,当回发CRUD操作时,我收到错误"无法创建接口的实例".我知道你不能创建一个接口的实例,但似乎我可以解决的唯一方法是使用自定义模型绑定器并通过FormCollection.这看起来非常混乱,我想尽可能多地保留项目中特定类型的代码 - 因此在任何地方接口和Ninject到DI的混凝土.自定义模型绑定不仅看起来很乱 - 我不会丢失我的DataAnnotations吗?
一些代码来描述我的内容:
public ActionResult Create()
{
// I'm thinking of using a factory pattern for this part
var objectToCreate = new ConcereteType();
return (objectToEdit);
}
[HttpPost]
public ActionResult Create(IRecord record)
{
// check model and pass to repository
if (ModelState.IsValue)
{
_repository.Create(record);
return View();
}
return View(record);
}
Run Code Online (Sandbox Code Playgroud)
有没有人遇到过这个?你是怎么克服它的?
谢谢!
dependency-injection interface model-binding loose-coupling asp.net-mvc-3
我正在尝试在MVC中使用自定义模型绑定程序,该绑定程序需要从IoC容器中解析。我遇到的问题是,在添加MVC服务时无法访问我的容器,因为还没有构建我的容器(并且我需要在构建容器之前添加MVC)。感觉就像是鸡/鸡蛋的问题,我确信我缺少一个简单的解决方案。
例:
services.AddMvc().AddMvcOptions(options =>
{
options.ModelBinders.Add(serviceProvider.Resolve<CustomModelBinder>());
});
Run Code Online (Sandbox Code Playgroud)
我的自定义模型活页夹如下所示:
public class CustomModelBinder : IModelBinder
{
private IServiceProvider serviceProvider;
public CustomModelBinder(IServiceProvider serviceProvider)
{
this.serviceProvider = serviceProvider;
}
public Task<ModelBindingResult> BindModelAsync(ModelBindingContext bindingContext)
{
var model = serviceProvider.GetService(bindingContext.ModelType);
bindingContext.Model = model;
var binder = new GenericModelBinder();
return binder.BindModelAsync(bindingContext);
}
}
Run Code Online (Sandbox Code Playgroud)