我正在阅读手工注射和注射(以及为什么使用Ninject).我遇到了两个混乱:
我已经熟悉手工注射技术,但我不熟悉Ninjection,因此不确定完整的程序是如何工作的.也许它有助于提供一个完整的程序,而不是像在该页面上所做的那样,显示一个分解为程序的程序
我仍然不知道如何让事情变得更容易.我想我错过了一些重要的事情.我可以看一下注入框架如何帮助你创建一组注射,然后同时在两个大组之间切换(这对于模拟等很有用),但我认为它还有更多功能.比起那个来说.但我不确定是什么.或许我只需要更多的例子说明为什么这一点令人兴奋.
对于DI和ninject来说,我是一个新手,我正在努力解决实际注入何时发生以及如何开始绑定的问题.
我已经在我的Web应用程序中使用它并且它在那里工作正常,但现在我想在类库中使用注入.
说我有这样一个类:
public class TestClass
{
[Inject]
public IRoleRepository RoleRepository { get; set; }
[Inject]
public ISiteRepository SiteRepository { get; set; }
[Inject]
public IUserRepository UserRepository { get; set; }
private readonly string _fileName;
public TestClass(string fileName)
{
_fileName = fileName;
}
public void ImportData()
{
var user = UserRepository.GetByUserName("myname");
var role = RoleRepository.GetByRoleName("myname");
var site = SiteRepository.GetByID(15);
// Use file etc
}
}
Run Code Online (Sandbox Code Playgroud)
我想在这里使用属性注入,因为我需要在构造函数中传入一个文件名.我是否正确说,如果我需要传入一个构造函数参数,我不能使用构造函数注入?如果我可以使用带有附加参数的构造函数注入,我该如何传递这些参数?
我有一个由Test类使用的控制台应用程序,如下所示:
class Program
{
static void Main(string[] args)
{
// NinjectRepositoryModule Binds my IRoleRepository …Run Code Online (Sandbox Code Playgroud) 注意:现在我输入了这个,我不得不为超长问题道歉,但是,我认为这里提供的所有代码和信息在某种程度上都是相关的.
好吧,我在ASP.NET webforms应用程序的随机点上得到奇怪的"Session Is Closed"错误.然而,今天,它终于在同一个地方一次又一次地发生.我几乎可以确定在我的代码中没有任何处理或关闭会话,因为使用的代码位远离所有其他代码,如下所示.
我也使用ninject作为我的IOC,这可能/可能不重要.
好的,首先,我SessionFactoryProvider和SessionProvider班级:
SessionFactoryProvider
public class SessionFactoryProvider : IDisposable
{
ISessionFactory sessionFactory;
public ISessionFactory GetSessionFactory()
{
if (sessionFactory == null)
sessionFactory =
Fluently.Configure()
.Database(
MsSqlConfiguration.MsSql2005.ConnectionString(p =>
p.FromConnectionStringWithKey("QoiSqlConnection")))
.Mappings(m =>
m.FluentMappings.AddFromAssemblyOf<JobMapping>())
.BuildSessionFactory();
return sessionFactory;
}
public void Dispose()
{
if (sessionFactory != null)
sessionFactory.Dispose();
}
}
Run Code Online (Sandbox Code Playgroud)
SessionProvider
public class SessionProvider : IDisposable
{
ISessionFactory sessionFactory;
ISession session;
public SessionProvider(SessionFactoryProvider sessionFactoryProvider)
{
this.sessionFactory = sessionFactoryProvider.GetSessionFactory();
}
public ISession GetCurrentSession()
{
if (session == null) …Run Code Online (Sandbox Code Playgroud) 我试图通过将一个工作单元实例传递到我的存储库来实现一个工作单元模式.
来自Global.asax的相关代码.
public class SiteModule : NinjectModule
{
public override void Load() {
Bind<IUnitOfWork>().To<SqlUnitOfWork>()
.InRequestScope()
.WithConstructorArgument("connectionString", ConfigurationManager.ConnectionStrings["Entities"].ConnectionString);
Bind<IProductRepository>().To<ProductRepository>();
Bind<ICategoryRepository>().To<CategoryRepository>();
}
}
Run Code Online (Sandbox Code Playgroud)
存储库构造函数:
public class ProductRepository {
IUnitOfWork unitOfWork;
public ProductRepository(IUnitOfWork unitOfWork) {
this.unitOfWork = unitOfWork;
}
}
public class CategoryRepository {
IUnitOfWork unitOfWork;
public CategoryRepository(IUnitOfWork unitOfWork) {
this.unitOfWork = unitOfWork;
}
}
Run Code Online (Sandbox Code Playgroud)
我想要的是SqlUnitOfWork每个请求最多创建一个实例并传递到我的存储库(通过它们各自的构造函数).
绑定InRequestScope()方法是否IUnitOfWork足够?如果不是我怎么能实现这一目标?
我有一个WinForms应用程序与此主窗体:
ICountRepository countRepository;
public MainForm(ICountRepository countRepository)
{
this.countRepository = countRepository;
}
public void IncrementCount()
{
countRepository.IncrementCount();
}
Run Code Online (Sandbox Code Playgroud)
但我正在努力注入ICountRepository主体.我怎么做 ?
我今天一直试图使用Ninject,并有几个问题.首先,我需要在我想要使用注入的所有构造函数上使用Inject属性.这看起来像是一个非常蹩脚的设计?我是否需要创建一个内核然后在注入的类中传递的所有内容?
我目前正在开发一个项目,我们将旧的DataSet,存储过程WinForm应用程序转换为使用实体框架,以便新网站可以访问相同的对象模型和存储库.
无论如何,我正在尝试在表单中实现依赖注入,以便我们可以使用模拟的存储库进行单元测试.我使用Ninject的原因很简单,我之前在MVC网站中使用过Ninject,但是在WinForm应用程序中尝试实现这一点,至少可以证明是有问题的,因为在WinForms中缺乏有关DI的信息而更加困难.网络.
到目前为止,我已经创建了Ninject Factory和存储库,但是我没有太多运气将存储库注入表单中.
因此,有人可以帮助我或提出任何建议吗?
下面我的部分代码可能有所帮助:
Ninject工厂:
public class NinjectFactory : NinjectModule
{
private IKernel _ninjectKernel;
public NinjectFactory()
{
_ninjectKernel = new StandardKernel();
}
public override void Load()
{
_ninjectKernel.Bind(typeof(IRepository<>)).To(typeof(GenericRepository<>));
_ninjectKernel.Bind(typeof(IProductionRepository)).To(typeof(ProductionRepository));
}
}
Run Code Online (Sandbox Code Playgroud)
带有存储库的表单:
Public Class TaskForm
Inherits BaseBusinessDialogForm
Private _repository As TaskRepository
Private _task As Production.Task = Nothing
Public Sub New(ByVal task As Production.Task)
InitializeComponent()
_repository = New TaskRepository(ConnectString)
If task.TaskID = 0 Then
_task = task
Else
_task = _repository.GetByID(task.TaskID)
End If
MyBase.BusinessObject = _task
Me.TaskBindingSource.DataSource = MyBase.BusinessObject …Run Code Online (Sandbox Code Playgroud) 我正在从IIS WebAPI迁移到OwinHost.利用nuget软件包的最新预发布版本,我在这里成功使用了说明:
https://github.com/ninject/Ninject.Web.Common/wiki/Setting-up-a-OWIN-WebApi-application
这是我的代码的存根:
public void Configuration(IAppBuilder app)
{
var config = new HttpConfiguration();
config.MapHttpAttributeRoutes();
app.UseNinjectMiddleware(CreateKernel);
app.UseNinjectWebApi(config);
}
private static StandardKernel CreateKernel()
{
var kernel = new StandardKernel();
kernel.Load(Assembly.GetExecutingAssembly());
RegisterServices(kernel);
return kernel;
}
private static void RegisterServices(IKernel kernel)
{
...
}
Run Code Online (Sandbox Code Playgroud)
但是在我的代码和文档示例中,Ninject内核直到启动后才会创建.但是,在Cors和OAuth中间件注册的启动注册过程中,我需要Ninject DI.在迁移到OwinHost之前,我可以这样做:
public void Configuration(IAppBuilder app)
{
_bootstrapper = new Bootstrapper();
_bootstrapper.Initialize(CreateKernel);
var config = new HttpConfiguration();
config.MapHttpAttributeRoutes();
// USE _boostrapper.Kernel here
app.UseNinjectMiddleware(CreateKernel);
app.UseNinjectWebApi(config);
}
Run Code Online (Sandbox Code Playgroud)
但在内部,OwinBootstrapper.Execute将最终调用CreateKernel和bootstrapper.Initialize第二次,结果不好.
在Startup中创建和使用ninject内核并仍然注册Ninject/WebAPI中间件的正确方法是什么?
我有一个Web Api 2应用程序,有两个类都依赖于另一个类,我正在使用ninject来解决依赖性.
public class AuthorizationServerProvider : OAuthAuthorizationServerProvider
{
private IUserService _userService;
public AuthorizationServerProvider(IUserService userService)
{
_userService = userService;
}
}
public class RefreshTokenProvider : IAuthenticationTokenProvider
{
private IUserService _userService;
public RefreshTokenProvider(IUserService userService)
{
_userService = userService;
}
Run Code Online (Sandbox Code Playgroud)
在startup.cs类中,我需要使用上面的两个类,但当然我不能在启动类中使用构造函数注入,因为它是在Ninject之前初始化的.
有什么方法可以在ConfigureAuth方法中引用_tokenProvider和_authServerProvider?
public class Startup
{
private AuthorizationServerProvider _authServerProvider;
private RefreshTokenProvider _tokenProvider;
public static OAuthBearerAuthenticationOptions OAuthBearerOptions { get; private set; }
public void Configuration(IAppBuilder app)
{
var config = new HttpConfiguration();
app.UseNinjectMiddleware(CreateKernel);
app.UseNinjectWebApi(config);
ConfigureOAuth(app);
WebApiConfig.Register(config);
app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
app.UseWebApi(config);
}
public void ConfigureOAuth(IAppBuilder app) …Run Code Online (Sandbox Code Playgroud) 我试图弄清楚如何注入UserManager和SignInManager.我在我的应用程序中安装了Ninject,并且我以下列方式使用它:
请将此视为一个全新的项目.在Startup.cs里面我有以下内容:
public partial class Startup
{
public void Configuration(IAppBuilder app)
{
ConfigureAuth(app);
app.UseNinjectMiddleware(CreateKernel);
}
private static IKernel CreateKernel()
{
var kernel = new StandardKernel();
kernel.Load(Assembly.GetExecutingAssembly());
return kernel;
}
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我要创建一些Dummy类并尝试根据其工作的接口注入它.我测试了它.我想弄清楚的是,我现在将如何从Startup.Auth.cs中删除以下内容并将其注入.没有我可以依赖的接口,我不知道如何做到这一点:
app.CreatePerOwinContext(ApplicationDbContext.Create);
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
app.CreatePerOwinContext<ApplicationSignInManager>(ApplicationSignInManager.Create);
Run Code Online (Sandbox Code Playgroud)
为了澄清一次,我的问题是:如何实例化ApplicationUserManager和ApplicationSignInManager并将其注入我的控制器参数中.这是我试图将其注入的控制器:
public AccountController(ApplicationUserManager userManager, ApplicationSignInManager signInManager)
{
UserManager = userManager;
SignInManager = signInManager;
}
Run Code Online (Sandbox Code Playgroud)
编辑:
这是我尝试过的:
private static IKernel CreateKernel()
{
var kernel = new StandardKernel();
kernel.Load(Assembly.GetExecutingAssembly());
kernel.Bind<IUserStore<ApplicationUser>>().To<UserStore<ApplicationUser>>();
kernel.Bind<UserManager<ApplicationUser>>().ToSelf();
return kernel;
}
Run Code Online (Sandbox Code Playgroud)
但有了这个我得到空引用错误
c# ninject entity-framework-6 asp.net-mvc-5 asp.net-identity
ninject ×10
c# ×6
.net ×2
asp.net ×2
asp.net-mvc ×2
owin ×2
winforms ×2
bootstrapper ×1
nhibernate ×1
unit-of-work ×1