我有一个 ASP.MVC 项目,其中使用 ninject 作为 IOC 容器。我已将绑定添加为基础结构文件夹中的单独类,如下所示:
public class NinjectControllerFactory : DefaultControllerFactory{
private readonly IKernel _ninjectKernal;
public NinjectControllerFactory()
{
_ninjectKernal = new StandardKernel();
PSCCheckContext m = _ninjectKernal.Get<PSCCheckContext>(new IParameter[]
{ new ConstructorArgument("appNamekey", "Name of Staff Application"),
new ConstructorArgument("serverLocationNameKey", "Location of Application Server") });
AddBindings();
}
Run Code Online (Sandbox Code Playgroud)
所以您可以看到我正在尝试在 PSCCheckContext 的构造函数中设置 web.config 中的两个参数。这是另一个处理数据库访问的 C# 应用程序。AddBindings() 类只是将接口类映射到您所期望的具体实现:
private void AddBindings()
{
...
_ninjectKernal.Bind<IPSCCheckContext>().To<PSCCheckContext>();
}
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是 PSCCheckContext 类中有 2 个构造函数,其中第二个构造函数采用不同的参数:
public class PSCCheckContext : IPSCCheckContext
{
public PSCCheckContext(string appNamekey, string serverLocationNameKey);
public PSCCheckContext(string imgNamekey, string imgFlagKey, …Run Code Online (Sandbox Code Playgroud) 在配置 Ninject/Topshelf/Quartz.Net 设置期间使用对象的正确方法是什么?
我创建了一个IocModule将我的接口绑定到一个具体类:
public class IocModule : NinjectModule
{
public override void Load()
{
Bind<IConfiguration>().To<JsonConfiguration>().InSingletonScope();
}
}
Run Code Online (Sandbox Code Playgroud)
在运行时间的 Quartz.Net 设置期间,我需要此配置中的一些值,但使用IConfiguration configuration = new JsonConfiguration();似乎不是执行此操作的正确方法:
namespace Question {
public class Program {
public static int Main(string[] args) {
var exitCode = HostFactory.Run(c => {
c.UseNinject(new IocModule());
// How can I get this from Ninject?
IConfiguration configuration = new JsonConfiguration();
configuration.Load();
c.Service<Service>(sc => {
sc.ConstructUsingNinject();
sc.WhenStarted((service, control) => service.Start(control));
sc.WhenStopped((service, control) => service.Stop(control));
sc.UseQuartzNinject();
sc.ScheduleQuartzJob(q => q.WithJob(() …Run Code Online (Sandbox Code Playgroud) 我在代码重构后收到来自 Ninject 的异常。因此我知道是什么导致了错误,但无法确定原因。代码编译文件,但我从 Ninject 收到运行时错误:
不能为空参数名:root
我正在尝试注入一个类的常量实例:
var subscriptionApiClientHelper = new SubscriptionApiClientHelper(AppSettings.Get<string>("AdminAPIUrl"),
AppSettings.Get<string>("APIV2Key"), Kernel.Get<ICache>());
kernel.Bind<SubscriptionApiClientHelper>().ToConstant(subscriptionApiClientHelper);
Run Code Online (Sandbox Code Playgroud)
Ninject 在第一行抛出异常。
我的类 SubscriptionApiClientHelper 继承自另一个类(在 Nuget 包中引用),因此:
public SubscriptionApiClientHelper(string baseUrl, string apiKey, ICache cache) : base(baseUrl, apiKey)
{
_cache = cache;
}
Run Code Online (Sandbox Code Playgroud)
其构造函数是这样的:
public SubscriptionApiClient(string baseUrl, string apiKey)
{
_baseUrl = baseUrl;
_apiKey = apiKey;
}
Run Code Online (Sandbox Code Playgroud)
这个基类中的几个方法被覆盖并实现了缓存,因此覆盖的原因是我不需要在基类的所有方法上实现缓存。我从同一个 Nuget 包中注入了一些其他类,但没有问题,但这些没有我怀疑导致问题的继承。注意我成功地注入并使用了我继承的基类(SubscriptionApiClient),它只是导致问题的辅助类。
这是完整的堆栈跟踪:
at Ninject.ResolutionExtensions.GetResolutionIterator(IResolutionRoot root, Type service, Func`2 constraint, IEnumerable`1 parameters, Boolean isOptional, Boolean isUnique)
at Ninject.ResolutionExtensions.Get[T](IResolutionRoot root, IParameter[] parameters)
at AdminPortal.NinjectWebCommon.RegisterServices(IKernel kernel) …Run Code Online (Sandbox Code Playgroud) 我正在考虑使用Prism在Silverlight 3中做一个项目,我非常喜欢这里显示的事件聚合http://development-guides.silverbaylabs.org/Video/Prism-Eventing
所有的资源似乎都指向使用Unity with Prism而不是Ninject.在Ninject中是否有类似的聚合事件的方式?或者,如果我想使用Prism,我只限于Unity吗?
如何在Ninject中编写此StructureMap行
ForRequestedType<HttpContextBase>()
.TheDefault.Is.ConstructedBy(x => new HttpContextWrapper(HttpContext.Current));
Run Code Online (Sandbox Code Playgroud)
?
我刚刚将我的MVC2项目升级到MVC3并使用NuGet库包引用来安装ninject.这创建了一个appstart类,我使用以下代码注入我的IMembershipService类.
public static void RegisterServices(IKernel kernel) {
kernel.Bind<IMembershipService>().To<AccountMembershipService>();
}
Run Code Online (Sandbox Code Playgroud)
例如,这适用于我的HomeController.
public class HomeController : Controller
{
public IMembershipService MembershipService { get; set; }
public HomeController() : this(null) { }
public HomeController(IMembershipService service)
{
MembershipService = service;
}
Run Code Online (Sandbox Code Playgroud)
但是,我正在使用BaseController.基类中几乎相同的代码不再有效.
public class BaseController : Controller
{
public IMembershipService MembershipService { get; set; }
public UserService UserService { get; set; }
public BaseController() : this(null, null) { }
public BaseController(IMembershipService service, UserService userService)
{
MembershipService = service;
UserService = userService ?? new UserService(); …Run Code Online (Sandbox Code Playgroud) 我有3个项目文件
webui - controllers and views
framework - service layer and repos
tests- unit tests
Run Code Online (Sandbox Code Playgroud)
所以我看到的是我的控制器只会与我的服务层(包含我的业务逻辑)对话.服务层将与repos通信并获取数据库数据.
我的回购只会说数据库并返回数据.
现在,如果我想进行单元测试,我需要有假的服务层和假存储库.
通过这种方式,我可以隔离地测试控制器和服务层.
那么我在哪里将我的ninject代码放在我的框架类库中,以便我可以将它与我的服务层一起使用?
编辑
史蒂文,你说我应该这样做
//使用mvc扩展在全局aspx中设置ninject
//现在绑定东西
private class SportsStoreServices : NinjectModule
{
public override void Load()
{
Bind<IAdminService>().To<AdminService>();
Bind<IAdminRepo>().To<AdminRepo>();
}
}
Run Code Online (Sandbox Code Playgroud)
//控制器
public class AccountController : Controller
{
//
// GET: /Account/
private IAdminService adminService;
public AccountController(IAdminService adminService)
{
this.adminService = adminService;
}
public ActionResult Login()
{
var getAllAdmins = adminService.GetAllAdmins();
return View();
}
}
Run Code Online (Sandbox Code Playgroud)
//服务层
public class AdminService : IAdminService
{ …Run Code Online (Sandbox Code Playgroud) dependency-injection ninject ioc-container repository-pattern asp.net-mvc-2
我有一个asp.net-mvc网站,我正在使用ninject for IOC和nhibernate用于我的ORM映射
这是我的IOC绑定代码:
internal class ServiceModule : NinjectModule
{
public override void Load()
{
Bind(typeof(IIntKeyedRepository<>)).To(typeof(Repository<>)).InRequestScope();
}
}
Run Code Online (Sandbox Code Playgroud)
以下是我如何将IOC用于控制器代码的示例:
public FAQController(IIntKeyedRepository<FAQ> faqRepository, IUnitOfWork unitOfWork)
{
_faqRepository = faqRepository;
_unitOfWork = unitOfWork;
}
Run Code Online (Sandbox Code Playgroud)
问题是到目前为止,每个控制器都有一个它指向的表,所以我只需要传递给它的存储库类...
现在,我有许多表和类都只有2个字段:
对于这些类中的每一个,我只是从一个名为的基类继承:
BaseModel
Run Code Online (Sandbox Code Playgroud)
这只是:
public class BaseModel
{
public virtual string Name { get; set; }
public virtual int Id { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我想要一个:
StaticDataController
Run Code Online (Sandbox Code Playgroud)
可以为从BaseModel继承的每个类执行所有CRUD的类(没有额外的字段)
愚蠢的简单方法是这样做:
private readonly IIntKeyedRepository<Object1> _object1Repository;
private readonly IIntKeyedRepository<Object2> _object2Repository;
private readonly IIntKeyedRepository<Object3> _object3Repository;
private readonly IIntKeyedRepository<Object4> _object4Repository; …Run Code Online (Sandbox Code Playgroud) asp.net-mvc dependency-injection ninject repository inversion-of-control
我正在使用NinjectDI容器.我有两个
public interface IRepository<T> where T : AbstractEntity<T>, IAggregateRoot
{
// methods signatures
}
public class Repository<T> : IRepository<T> where T : AbstractEntity<T>, IAggregateRoot
{
// implementations
}
Run Code Online (Sandbox Code Playgroud)
然后我试图将它们绑定在一个单独的模块中
public class DataAccessModule : Ninject.Modules.NinjectModule
{
public override void Load()
{
this.Bind<IRepository<>>().To<Repository<>>();
}
}
Run Code Online (Sandbox Code Playgroud)
哪里this.Bind<IRepository<>>().To<Repository<>>();不被承认为陈述.
如何进行绑定?
我在MVC4应用程序中使用nInject.我想实现我自己的ApplicationUserManager版本,因为scaffolded创建了一个单独的数据库上下文实例(我使用nInject将请求范围数据库上下文注入到我的控制器中).ApplicationUserManager中具有单独的数据库上下文在操作用户凭据时会导致一些奇怪的问题.
但是我遇到了创建nInject绑定的问题:
private static void RegisterServices(IKernel kernel)
{
kernel.Bind<CampaignDbContext>().ToSelf().InRequestScope();
kernel.Bind<ApplicationUserManager>().ToSelf().InRequestScope();
kernel.Bind<ApplicationSignInManager>().ToSelf().InRequestScope();
}
Run Code Online (Sandbox Code Playgroud)
第一个工作正常,大概是因为CampaignDbContext有一个无参数构造函数.
但第二个和第三个失败了.ApplicationUserManager的构造函数定义为:
public ApplicationUserManager( CampaignDbContext context )
: base( new UserStore<CampaignDbUser>( context ) )
{
// Configure validation logic for usernames
UserValidator = new UserValidator<CampaignDbUser>(this)
{
AllowOnlyAlphanumericUserNames = true,
RequireUniqueEmail = true
};
// etc
Run Code Online (Sandbox Code Playgroud)
我认为因为CampaignDbContext本身是自绑定的,它的实例将传递给ApplicationUserManager的构造函数.但根据我得到的错误消息,似乎没有发生这种情况.
如何配置nInject绑定?
ninject ×10
c# ×5
asp.net-mvc ×4
.net ×1
generics ×1
nuget ×1
prism ×1
quartz.net ×1
repository ×1
silverlight ×1
structuremap ×1
topshelf ×1