使用NInject解析具有多个构造函数的类似乎不起作用.
public class Class1 : IClass
{
public Class1(int param) {...}
public Class1(int param2, string param3) { .. }
}
Run Code Online (Sandbox Code Playgroud)
以下似乎不起作用:
IClass1 instance =
IocContainer.Get<IClass>(With.Parameters.ConstructorArgument(“param”, 1));
Run Code Online (Sandbox Code Playgroud)
模块中的钩子很简单,在我添加额外的构造函数之前工作:Bind().To();
在Autofac中,可以在注册服务时指定TypedParameter,该服务给出将传递给服务构造函数的特定值或委托.在解析/实例化期间,将通过类型发现构造函数上的实际参数.
在Ninject中,我只能找到对命名参数的支持(即,提前知道.ctor参数的实际名称).否则,Ninject将发现未指定的构造函数参数,并尝试通过检查容器来解析所需的任何类型.
但是,这对我的需求来说还不够具体,因为我需要传递给不同服务实例的构造函数的多个相同类型的实例.
我想给Ninject一个特定的工厂委托或值作为构造函数参数,只给出一个类型作为限定符,而不是参数名称.我也不希望通过使用任何属性修饰构造函数参数来依赖Ninject.
这可能吗?提前谢谢了!
当使用Ninject和mvc3时,我们会做类似的事情,安装ninject,registerger modules-or-services.
我们写这样的控制
public class HomeController : Controller
{
private IHelloService _service;
public HomeController(IHelloService service)
{
_service = service;
}
public string Index()
{
return _service.GetGreeting();
}
}
Run Code Online (Sandbox Code Playgroud)
public class HomeController : Controller
{
private IHelloService _service;
/*
No default constructor
*/
public string Index()
{
_service= Ask_Ninject_to_provide_resource
return _service.GetGreeting();
}
}
Run Code Online (Sandbox Code Playgroud) 我正在使用ninject来注入我的存储库.我想要继承我的基类,但我不能因为它有一个构造函数.
基础控制器:
namespace Orcha.Web.Controllers
{
public class BaseController : Controller
{
public IRepository<string> db;
public BaseController(Repository<string> db){
this.db = db;
Debug.WriteLine("Repository True");
}
}
}
Run Code Online (Sandbox Code Playgroud)
具有继承的控制器: 错误'BaseController'不包含带有0个参数HomeController.cs的构造函数
public class HomeController : BaseController
{
public ActionResult Index()
{
ViewBag.Message = "Welcome to ASP.NET MVC!";
return View();
}
public ActionResult About()
{
return View();
}
}
Run Code Online (Sandbox Code Playgroud) 我正在使用ASP.NET Web API和Ninject组建一个REST服务,但我怀疑这可能是一个比IoC框架更具体的IoC问题.我有许多对象需要访问用户实体的简单缓存:
public class UserCache
{
private IList<User> users;
private IUserRepositoryFactory factory;
[Inject]
public UserCache(IUserRepositoryFactory factory)
{
this.factory = factory;
this.users = new List<User>();
}
public void Add(int id)
{
IUserRepository repo = factory.Create(new TestContext());
this.users.Add(repo.Get(id));
}
public int Count { get { return this.users.Count; } }
}
Run Code Online (Sandbox Code Playgroud)
在实践中,缓存是直读的,并且将使用UserRepository(和关联的IUserRepository接口)填充用户实体:
public class UserRepository : IUserRepository
{
private readonly TestContext context;
public UserRepository(TestContext context)
{
this.context = context;
}
public User Get(int id)
{
return new User() { Name = "Test …Run Code Online (Sandbox Code Playgroud) 我正在开发一个应用程序并使用Ninject进行DI.我希望能够根据我使用的解决方案配置将不同的对象注入给定的方法.也就是说,在"模拟"配置模式中,我想注入一个模拟对象,并且在调试/发布配置中,我想注入一个真实对象.
阅读 Ninject和配置后,我理解XML配置提供了这样的可能性.但是,如果可能的话,我想在没有XML的情况下这样做.(我倾向于同意Ninject的注意细节不应该在已发布的产品中配置......)我也知道我可以使用预处理器指令来执行此操作.我想知道的是,如果Ninject中存在此功能,或者我需要扩展/解决方法来完成它.
在MVC 5中,我们得到了这样的帐户控制器.
public class AccountController : Controller
{
public AccountController()
: this(new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new DatePickerDbContext())))
{
}
public AccountController(UserManager<ApplicationUser> userManager)
{
UserManager = userManager;
}
}
Run Code Online (Sandbox Code Playgroud)
我安装了Ninject来处理我的依赖注入.我有两个存储库,我想在我的AccountController中使用,现在代码看起来像这样
public class AccountController : Controller
{
private readonly ILicenserepository _licenserepository;
private readonly IUserRepository _userRepository;
public AccountController(ILicenserepository licenserepository, IUserRepository userRepository)
: this(new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new DatePickerDbContext())))
{
_licenserepository = licenserepository;
_userRepository = userRepository;
}
public AccountController(UserManager<ApplicationUser> userManager)
{
UserManager = userManager;
}
}
Run Code Online (Sandbox Code Playgroud)
在ninject.web.common中,这就是我所做的
private static void RegisterServices(IKernel kernel)
{
kernel.Bind(typeof (ILicenserepository)).To(typeof (Licenserepository));
kernel.Bind(typeof (IUserRepository)).To(typeof …Run Code Online (Sandbox Code Playgroud) 我目前正在启动ASP.NET MVC 4,在我正在阅读的书中,作者介绍了Ninject的依赖注入.他创建了一个自定义依赖项解析器(我不完全理解它是如何工作的,但我认为它的用途是轻松管理依赖项解析).
这是控制器代码:
public class HomeController : Controller
{
private Product[] products = {
new Product {Name = "Kayak", Category = "Watersports", Price = 275M},
new Product {Name = "Lifejacket", Category = "Watersports", Price = 48.95M},
new Product {Name = "Soccer ball", Category = "Soccer", Price = 19.50M},
new Product {Name = "Corner flag", Category = "Soccer", Price = 34.95M}
};
private IValueCalculator calc;
public HomeController(IValueCalculator calcParam)
{
calc = calcParam;
}
public ActionResult Index()
{
ShoppingCart cart = …Run Code Online (Sandbox Code Playgroud) 注入/隔离密封在dll中并且不实现接口的类的首选方法是什么?
我们使用Ninject.
假设我们有一个类"Server",我们想要注入/隔离"Server"使用的类TcpServer.
不想太具体,因为我想知道最好的方法,但让我们这样说:
public class Server
{
IServer _server;
public Server(IServer server)
{
_server = server;
}
public void DoSomething()
{
_server.DoSomething();
}
}
Run Code Online (Sandbox Code Playgroud)
_server 在测试的情况下,应该注入TcpClient或mock
我将此问题作为文档发布,因为我花了很多时间才找到这个简单的问题.我正在接受VS15生成的原始MVC项目并尝试修改它.
错误:[InvalidOperationException:实体类型ApplicationUser不是当前上下文模型的一部分.]