在使用Ninject.MVC 2.2.0.3(合并之后)的MVC3应用程序中,而不是将repostories直接注入控制器,我试图创建一个包含businesslogic的服务层并在那里注入repostories.我将ninject-DependencyResolver作为动态对象传递给服务层(因为我不想在那里引用mvc或ninject).然后我在其上调用GetService来获取我在NinjectHttpApplicationModule中指定的绑定和生命周期的存储库.编辑:简而言之,它失败了.
在这种情况下,如何将IoC容器传递给服务层?(不同的方法也非常受欢迎.)
编辑:这是一个例子来说明我如何理解答案和评论.
我应该避免服务定位器(反)模式,而是使用依赖注入.所以我想说我想在Northwind中为产品和类别创建一个管理站点.我根据表定义创建模型,存储库,服务,控制器和视图.此时服务直接调用存储库,没有逻辑.我有功能支柱,视图显示原始数据.这些绑定是为NinjectMVC3配置的:
private static void RegisterServices(IKernel kernel)
{
kernel.Bind<ICategoryRepository>().To<CategoryRepository>();
kernel.Bind<IProductRepository>().To<ProductRepository>();
}
Run Code Online (Sandbox Code Playgroud)
存储库实例是由ninject通过ProductController中的两层构造函数注入创建的:
private readonly ProductsService _productsService;
public ProductController(ProductsService productsService)
{
// Trimmed for this post: nullchecks with throw ArgumentNullException
_productsService = productsService;
}
Run Code Online (Sandbox Code Playgroud)
和产品服务:
protected readonly IProductRepository _productRepository;
public ProductsService(IProductRepository productRepository)
{
_productRepository = productRepository;
}
Run Code Online (Sandbox Code Playgroud)
我现在没有必要解耦服务,但已准备好模拟数据库.
要在Product/Edit中显示类别下拉列表,我创建一个ViewModel,除了Product之外还包含类别:
public class ProductViewModel
{
public Product Product { get; set; }
public IEnumerable<Category> Categories { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
ProductsService现在需要CategoriesRepository来创建它.
private readonly ICategoryRepository _categoryRepository; …
Run Code Online (Sandbox Code Playgroud) asp.net-mvc ninject inversion-of-control ninject-2 asp.net-mvc-3
Kernel.Get()线程安全吗?我的目标是在我的所有组件中共享我的内核实例,他们可能会在不同的线程上同时调用Kernel.Get().
Kernel.Get()线程安全吗?
在所有位于不同dll中的应用程序组件之间共享应用程序内核的最佳模式是什么?如果这是有意义的,我不希望将工厂的实例传递给我的应用程序的每个组件.
是否可以将Ninject配置为加载已声明为的模块internal
?
我已经尝试配置InternalVisibleTo
Ninject程序集,但这没有帮助.
我当然可以制作模块public
,但实际上它们应该是internal
.
我有一个自定义DataAnnotationsModelValidatorProvider,用于以更动态的方式进行模型验证,然后只添加属性.我试图将我的提供添加到global.asax.cs,如下所示:
ModelValidatorProviders.Providers.Clear();
ModelValidatorProviders.Providers.Add(new AttributeValidatorProvider());
Run Code Online (Sandbox Code Playgroud)
但是一旦我加载了表单,我就会收到一条错误消息:"不显眼的客户端验证规则中的验证类型名称必须是唯一的.以下验证类型不止一次出现:必需".
根据这篇博客的评论,这是因为Ninject重写了自定义验证器提供商.
我是MVC的新手,我似乎无法找到告诉Ninject接受我的自定义提供商的方法,我将如何解决这个问题?
为了记录:我不想使用Fluentvalidation.net,我想坚持使用默认的MVC验证(大多数情况下).
我试着获得一个类型的所有方法的列表.Type提供GetMethods方法来执行此操作.但不幸的是,它似乎被错误地实施了.只要在反射类型上没有重写的泛型方法,它就能正常工作.在这种特殊情况下,抛出MethodAccessException.
有没有人有这个WP7错误的解决方法?如果返回除通用方法之外的所有方法,我很好.
以下是将抛出异常的类的示例.注意:none泛型返回值旨在证明返回值不涉及问题.此外,基本方法可以改为摘要,问题仍然存在.
public abstract class BaseClassWithGenericMethod
{
public virtual System.Collections.IList CreateList<T>()
{
return new List<T>();
}
}
public class DerivedClassWithGenericMethod
: BaseClassWithGenericMethod
{
public override System.Collections.IList CreateList<T>()
{
return new List<T>();
}
}
Run Code Online (Sandbox Code Playgroud) 您好,我正在尝试使用注入实现全局过滤器.过滤器看起来像这样.
public class WikiFilter : IActionFilter
{
private IWikiService service;
public WikiFilter(IWikiService service)
{
this.service = service;
}
public void OnActionExecuting(ActionExecutingContext filterContext)
{
!!!Code here!!
}
public void OnActionExecuted(ActionExecutedContext filterContext)
{
throw new NotImplementedException();
}
}
Run Code Online (Sandbox Code Playgroud)
我在global.asax中按照以下方式附加了过滤器.
public class MvcApplication : System.Web.HttpApplication,
IAuthenticationApplication<User>
{
protected void Application_Start()
{
Ninject();
AreaRegistration.RegisterAllAreas();
RegisterRoutes(RouteTable.Routes);
RegisterGlobalFilters(GlobalFilters.Filters);
}
private void Ninject()
{
// Create Ninject DI kernel
IKernel kernel = new StandardKernel();
kernel.Bind<DataContext>().ToSelf().InRequestScope();
kernel.Bind<IWikiRepository>().To<WikiRepository>();
kernel.Bind<IWikiService>().To<WikiService>();
// Global filters
kernel.BindFilter<WikiFilter>(FilterScope.Global, 0);
DependencyResolver.SetResolver
(new NinjectDependencyResolver(kernel));
}
} …
Run Code Online (Sandbox Code Playgroud) 我有一个引用数据和实体层的Web.现在我想用一个控制台应用程序来扩展我的解决方案,该应用程序将执行与数据库相关的一些事情,因此也引用了数据和实体层.在我的数据和实体层中,我正在使用依赖注入,并且正在考虑是否需要再次为这些注入声明所有绑定(例如在我的Web应用程序中) - 或者我可以以某种方式共享它们,以便我的Web和控制台应用程序使用相同的绑定?
我的第一个想法是创建一个包含所有绑定的公共库,然后只调用我需要的那些..但是这会导致对程序集的大量加载的unessecary引用.
简而言之:如何在我的Web应用程序和控制台应用程序中声明我的依赖注入绑定一次并使用它们?
有什么建议?
ninject ×6
ninject-2 ×3
.net ×1
asp.net ×1
asp.net-mvc ×1
c# ×1
console ×1
ninject.web ×1
reflection ×1