我有一个引用数据和实体层的Web.现在我想用一个控制台应用程序来扩展我的解决方案,该应用程序将执行与数据库相关的一些事情,因此也引用了数据和实体层.在我的数据和实体层中,我正在使用依赖注入,并且正在考虑是否需要再次为这些注入声明所有绑定(例如在我的Web应用程序中) - 或者我可以以某种方式共享它们,以便我的Web和控制台应用程序使用相同的绑定?
我的第一个想法是创建一个包含所有绑定的公共库,然后只调用我需要的那些..但是这会导致对程序集的大量加载的unessecary引用.
简而言之:如何在我的Web应用程序和控制台应用程序中声明我的依赖注入绑定一次并使用它们?
有什么建议?
我已经使用Ninject和MVC3来自动注入构造函数参数.它运作得很好.
你如何做与非MVC代码类似的事情.
例如:
public class Ninja
{
private readonly IWeapon _weapon;
public Ninja(IWeapon weapon)
{
_weapon = weapon;
}
public void Strike()
{
_weapon.Strike();
}
}
public class MyProgram
{
public void DoStuff()
{
var Ninja = new Ninja(); // I'm wanting Ninject to call the parameterized Ninja constructor
ninja.Strike();
}
}
Run Code Online (Sandbox Code Playgroud)
我如何改变代码以使其工作?
我有一个使用Ninject连接到单个数据库的MVC应用程序.现在我需要支持多个数据库.目前,我的global.asax.cs文件对ninject有以下定义:
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterRoutes(RouteTable.Routes);
//Using DI for controllers - use the Ninject custom controller factor
ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory()); // Repository config is defined in ninject controller
}
Run Code Online (Sandbox Code Playgroud)
这是我的Ninject控制器类的样子:
public class NinjectControllerFactory : DefaultControllerFactory
{
private IKernel kernel = new StandardKernel(new EriskServices());
protected override IController GetControllerInstance(RequestContext context, Type controllerType)
{
if (controllerType == null)
return null;
return (IController)kernel.Get(controllerType);
}
private class EriskServices : NinjectModule
{
public override void Load()
{
Bind<IRisksRepository>().To<MySql_RisksRepository>()
.WithConstructorArgument("connectionString", ConfigurationManager.ConnectionStrings["mydb1"].ConnectionString);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我还有一个处理用户身份验证的登录页面.它通过LDAP完成,不需要数据库连接.
我的问题是:我可以在用户身份验证登录页面之后绑定ninject connectionString吗?用户将拥有他们想要连接的数据库的下拉列表,例如"mydb1"或"mydb2"或"mydb3".每个连接字符串都将在web.config文件中定义. …
我一直在寻找其他相关的帖子,但我没有找到任何东西,所以这里......
我有一个(超级)简单的Ninject测试,它使用NullReferenceExcption失败,我找不到任何关于原因的信息.如果在接口中定义了C#简化属性访问器,则会发生这种情况,否则就可以了.如果我删除了get; 组; 功能按预期工作.
我的问题是我只是在做一些不应该工作的事情 - 例如,这与不赞成的现场注入功能有关吗?
整个(失败)的例子非常简短:
using System;
using Ninject;
namespace NinjectIFPropError
{
public interface IDummy
{
int Number {get;set;}
void Doit();
}
public class DummyClass : IDummy
{
public int Number {get;set;}
public void Doit()
{
Console.WriteLine("Doit");
}
}
class Program
{
public static void Main (string[] args)
{
IKernel kernel = new StandardKernel();
kernel.Bind<IDummy>().To<DummyClass>();
IDummy id = kernel.Get<IDummy>();
id.Doit();
}
}
}
Run Code Online (Sandbox Code Playgroud)
我在Ubuntu 11.10上使用默认的Mono 2.10.5安装.Ninject是从Ninject.org下载的.Net 4.0的v2.2.1.0.
任何信息,将不胜感激.
/一个
我也附加了堆栈跟踪(很长):
Unhandled Exception: System.NullReferenceException: Object reference not set …Run Code Online (Sandbox Code Playgroud) 我是DI和IoC模式的新手.
public class LazySessionContext
{
private readonly ISessionFactoryImplementor factory;
private const string CurrentSessionContextKey = "NHibernateCurrentSession";
public LazySessionContext(ISessionFactoryImplementor factory)
{
this.factory = factory;
}
/// <summary>
/// Retrieve the current session for the session factory.
/// </summary>
/// <returns></returns>
public ISession CurrentSession()
{
Lazy<ISession> initializer;
var currentSessionFactoryMap = GetCurrentFactoryMap();
if (currentSessionFactoryMap == null ||
!currentSessionFactoryMap.TryGetValue(factory, out initializer))
{
return null;
}
return initializer.Value;
}
/// <summary>
/// Bind a new sessionInitializer to the context of the sessionFactory.
/// </summary>
/// <param …Run Code Online (Sandbox Code Playgroud) 任何人都有运气让Ninject在MonoDroid上工作吗?我从他们的网站尝试过2.0和4.0单声道版本,并尝试了.net版本.
使用Mono构建,我在StandardKernel的实例化中遇到了MissingMethodException
我正在尝试将一个属性注入我的一个名为UnitOfWorkAttribute的ActionFilter中.我有这个代码:
[Inject]
public IUnitOfWork UnitOfWork { get; set; }
Run Code Online (Sandbox Code Playgroud)
在执行之前,我告诉Ninject解决这个问题:
Bind<IUnitOfWork>().To<NHibernateUnitOfWork>().InThreadScope();
Run Code Online (Sandbox Code Playgroud)
我的问题是,在我的UnitOfWorkAttribute类中,每当我尝试使用我的UnitOfWork属性时,它都会显示为Null.这是我的界面:
public interface IUnitOfWork : IDisposable
{
void Begin();
void Commit();
void Rollback();
}
Run Code Online (Sandbox Code Playgroud)
这是我的具体内容:
public interface INHibernateUnitOfWork : IUnitOfWork
{
ISession Session { get; }
}
public class NHibernateUnitOfWork : INHibernateUnitOfWork
{
private readonly ISessionSource sessionSource;
private ITransaction transaction;
private ISession session;
private bool disposed;
private bool begun;
public NHibernateUnitOfWork(ISessionSource sessionSource)
{
this.sessionSource = sessionSource;
Begin();
}
//.......
}
Run Code Online (Sandbox Code Playgroud)
我正在履行//下的界面......
我在这做错了什么?
我正在使用Ninject 3.0将服务层数据访问类注入我的控制器.我想在运行时将客户端的域用户ID添加到这些类,但无法弄清楚我应该使用哪种方法.目前我NinjectModule看起来像这样:
public class NinjectBindModule : NinjectModule
{
public override void Load()
{
Bind<ISomeRepo>().To<SomeRepo>();
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题,分两部分真的是:
WithConstructorArgument用来获取用户ID SomeRepo,还是其他东西(属性?).我是否可以在绑定模块中执行此操作,还是必须在内核或控制器级别执行此操作?如何使Ninject在运行时基于变量实例化对象?
我试图在控制器动作中注入正确的存储库 - MVC 3 - 基于来自用户输入的参数.如果用户输入"宝马",将绑定ICarRepository 到BMWRepository,如果他输入"KIA" KiaRepository将被注入.
[HttpPost]
public ActionResult SearchResult(FormCollection values)
{
string carModel = values["model"];
ICarRepository myRepository = RepositoryFactory.getRepository(carModel);
.....
}
Run Code Online (Sandbox Code Playgroud)
这是通过开关/案例noob实例化或参数化工厂知道的,我知道如何在没有Ninject的情况下手动完成,请查看此处介绍的4种方法探索工厂模式
我的问题是如何用Ninject做到这一点?
在这里,我使用DI框架(Ninject),它工作正常.但是面临的问题之一是,我有一个带有单个构造函数的基类,它接受一个接口的实现.
public class BaseApiController : ApiController
{
readonly IAccessService _accessService;
public BaseApiController(IAccessService accessService)
{
this._accessService = accessService;
}
}
Run Code Online (Sandbox Code Playgroud)
当我从这个基类继承到所有其他控制器时,这些控制器具有实现自己接口的构造函数.我得到错误'BaseApiController'不包含一个带0参数的构造函数,好吧,我明白了.派生类是
public class DiscoverController : BaseApiController
{
readonly IDiscoverService _discoverService;
readonly IAccessService _accessService;
public DiscoverController(IDiscoverService discoverService,IAccessService accessService)
{
_accessService = accessService;
_discoverService = discoverService;
}
}
Run Code Online (Sandbox Code Playgroud)
我怎么能这样做而不修改派生类ctor采取类似的参数并将该值传递给基本ctor,如果你建议更好的方法处理这个,我将不胜感激?
c# model-view-controller dependency-injection ninject asp.net-web-api