dependency-injection – Ninject:构造函数参数
|
我正在使用Ninject和ASP.NET MVC 4.我正在使用存储库并希望进行构造函数注入以将存储库传递给其中一个控制器. 这是我的Repository界面: public interface IRepository<T> where T : TableServiceEntity
{
void Add(T item);
void Delete(T item);
void Update(T item);
IEnumerable<T> Find(params Specification<T>[] specifications);
IEnumerable<T> RetrieveAll();
void SaveChanges();
}
下面的AzureTableStorageRepository是IRepository< T>的实现: public class AzureTableRepository<T> : IRepository<T> where T : TableServiceEntity
{
private readonly string _tableName;
private readonly TableServiceContext _dataContext;
private CloudStorageAccount _storageAccount;
private CloudTableClient _tableClient;
public AzureTableRepository(string tableName)
{
// Create an instance of a Windows Azure Storage account
_storageAccount = CloudStorageAccount.Parse(ConfigurationManager.ConnectionStrings["StorageConnectionString"].ConnectionString);
_tableClient = _storageAccount.CreateCloudTableClient();
_tableClient.CreateTableIfNotExist(tableName);
_dataContext = _tableClient.GetDataServiceContext();
_tableName = tableName;
}
请注意tableName参数,因为我使用通用表存储库将数据持久保存到Azure. 最后我有以下控制器. public class CategoriesController : ApiController
{
static IRepository<Category> _repository;
public CategoriesController(IRepository<Category> repository)
{
if (repository == null)
{
throw new ArgumentNullException("repository");
}
_repository = repository;
}
现在我想将一个存储库注入控制器.所以我创建了一个包含绑定的模块: /// <summary>
/// Ninject module to handle dependency injection of repositories
/// </summary>
public class RepositoryNinjectModule : NinjectModule
{
public override void Load()
{
Bind<IRepository<Category>>().To<AzureTableRepository<Category>>();
}
}
模块的加载在NinjectWebCommon.cs中完成 /// <summary>
/// Creates the kernel that will manage your application.
/// </summary>
/// <returns>The created kernel.</returns>
private static IKernel CreateKernel()
{
var kernel = new StandardKernel();
kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();
RegisterServices(kernel);
return kernel;
}
/// <summary>
/// Load your modules or register your services here!
/// </summary>
/// <param name="kernel">The kernel.</param>
private static void RegisterServices(IKernel kernel)
{
// Load the module that contains the binding
kernel.Load(new RepositoryNinjectModule());
// Set resolver needed to use Ninject with MVC4 Web API
GlobalConfiguration.Configuration.DependencyResolver = new NinjectResolver(kernel);
}
DependencyResolver的创建是因为Ninject的DependencyResolver实现了System.Web.Mvc.IDependencyResolver,并且无法将其分配给WebApi应用程序的GlobalConfiguration.Configuration. 所有这一切,Ninject部分实际上是在Controller中注入正确的类型,但是Ninject不能在AzureTableRepository的构造函数中注入tableName参数. 在这种情况下我怎么能这样做?我已经查阅了很多文章和ninject文档,看看我如何使用参数,但我似乎无法让它工作. 任何帮助,将不胜感激. 解决方法我使用WithConstructorArgument()方法,如…Bind<IRepository<Category>>().To<AzureTableRepository<Category>>()
.WithConstructorArgument("tableName","categories");
存储库设计的其余部分可能是另一个问题.恕我直言创建一张桌子或在ctor中做任何繁重的工作似乎是一件很大的事. (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 单元测试后面的ASP.NET代码
- asp.net – MSBuild:自动收集db迁移脚本?
- asp.net-mvc – 从扩展Apicontroller的MVC控制器返回Json
- ASP.NET’Session.Remove(key)’v / s’Session(key)= noth
- .net – 我应该在HttpCookie.Expires和HttpCachePolicy.Set
- asp.net-mvc – IE 11 SignalR不工作
- asp.net – 如何在.net vb中发送POST?
- asp.net – 使用Razor的Html.EditFor限制文本框中字符的长度
- asp.net-mvc – 具有SelectList(s)最佳实践的ASP.NET MVC V
- asp.net – .axd文件生成404错误
- asp.net-mvc-5 – MVC5中的域路由
- ASP.NET中的401.2的customerrors
- asp.net-mvc-4 – 调用客户端时应该发出服务器端
- 在ASP.Net MVC中控制JsonResult中的序列化器也称
- asp.net-mvc – 使用IIS 7中的ASP.NET MVC 1来路
- asp.net – 奇数编号单元格未添加到Pdf
- asp.net-mvc-3 – 在Post上,下拉列表SelectList.
- 线程是否在ASP.Net中的请求之间重用?
- asp.net – 多个DataContext类是否适合?
- asp.net-mvc – asp.net mvc ajax post – redir
