这可能与Passog ILogger或ILoggerFactory与AspNet Core中的构造函数有些关联?但是,这特别是关于库设计,而不是关于使用这些库的实际应用程序如何实现其日志记录.
我写一个.NET 2.0标准库将通过的NuGet安装,并允许使用图书馆的人得到一些调试信息,我根据Microsoft.Extensions.Logging.Abstractions允许标准化的记录器被注入.
但是,我看到了多个接口,Web上的示例代码有时会使用ILoggerFactory并在类的ctor中创建一个记录器.还有ILoggerProvider看起来像Factory的只读版本,但实现可能会也可能不会实现两个接口,所以我必须选择.(工厂似乎比提供商更常见).
我见过的一些代码使用了非泛型ILogger接口,甚至可能共享同一个记录器的一个实例,有些代码接受ILogger<T>他们的ctor并期望DI容器支持开放泛型类型或显式注册ILogger<T>我的库中的每个变体使用.
现在,我确实认为这ILogger<T>是正确的方法,也许是一个不接受该论证而只是通过Null Logger的ctor.这样,如果不需要记录,则不使用任何记录.然而,一些DI容器选择了最大的ctor,因此无论如何都会失败.
我很好奇我应该在这里做什么来为用户创造最少的头痛,同时如果需要仍然允许适当的日志记录支持.
目前缺乏关于DI主题的文档 - 依赖注入.有人可以帮我理解以下内容:
这些注册有什么区别?
public void ConfigureServices(IServiceCollection services)
{
services.AddTransient<IService, Service>();
services.AddScoped<IService, Service>();
services.AddSingleton<IService, Service>();
services.AddInstance(service);
}
Run Code Online (Sandbox Code Playgroud)我正在查看本教程http://asp-umb.neudesic.com/mvc/tutorials/validating-with-a-service-layer--cs,了解如何围绕包装器包装我的验证数据.
我想使用依赖注入.我正在使用ninject 2.0
namespace MvcApplication1.Models
{
public interface IValidationDictionary
{
void AddError(string key, string errorMessage);
bool IsValid { get; }
}
}
Run Code Online (Sandbox Code Playgroud)
//包装
using System.Web.Mvc;
namespace MvcApplication1.Models
{
public class ModelStateWrapper : IValidationDictionary
{
private ModelStateDictionary _modelState;
public ModelStateWrapper(ModelStateDictionary modelState)
{
_modelState = modelState;
}
#region IValidationDictionary Members
public void AddError(string key, string errorMessage)
{
_modelState.AddModelError(key, errorMessage);
}
public bool IsValid
{
get { return _modelState.IsValid; }
}
#endregion
}
}
Run Code Online (Sandbox Code Playgroud)
//控制器
private IProductService _service;
public ProductController()
{ …Run Code Online (Sandbox Code Playgroud) 我试图在2016年5月发布的.NET Core中安装Ninject 3.3.2.我收到一个错误:依赖Ninject 3.2.2不支持框架.NETCoreApp,Version = v1.0.有没有人有类似的问题,有什么解决方案吗?
我听说在下一版本的ASP.NET(ASP.NET vnext)中,将在框架中内置依赖注入.有谁知道更多关于这个?它会是统一还是新框架?我在哪里可以找到更多相关信息?
根据Castle Windsor教程和早期版本的MVC(pre-6)和WebAPI,我使用了Castle Windsor与安装人员和设施.
ASP.NET(5)Core已经包含了一些依赖注入支持,但我仍然没有弄清楚如何连接它,我发现的几个样本看起来与我之前使用它的方式有很大不同(使用安装/设施).大多数示例早于ASP.NET(5)核心最近发布,有些似乎已经过时的信息.
它似乎从之前版本的组合根设置中发生了极大的变化,Microsoft.Framework.DependencyInjection.ServiceProvider当我将其设置为Castle Windsor DI后备时,甚至无法解析所有依赖项.我还在深入研究细节,但没有太多最新信息.
我找到了这样的适配器:Github Castle.Windsor DI容器.
Startup.cs
private static IWindsorContainer container;
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerfactory)
{
container = new WindsorContainer();
app.UseServices(services =>
{
// ADDED app.ApplicationServices FOR FALLBACK DI
container.Populate(services, app.ApplicationServices);
container.BeginScope();
return container.Resolve<IServiceProvider>();
});
// ... default stuff
Run Code Online (Sandbox Code Playgroud)
WindsorRegistration.cs
我添加了几行来添加Castle Windsor ILazyComponentLoader后备.
using Castle.MicroKernel.Lifestyle;
using Castle.MicroKernel.Registration;
using Castle.MicroKernel.Resolvers.SpecializedResolvers;
using Castle.Windsor;
using Microsoft.Framework.DependencyInjection;
using System;
using System.Collections.Generic;
using System.Reflection;
namespace Notes.Infrastructure
{
/// <summary> …Run Code Online (Sandbox Code Playgroud) dependency-injection castle-windsor asp.net-core-mvc asp.net-core
我发现Ninject最近引入了对.NET Standard 2.0/.NET Core 2.0的支持.
但是,我找不到任何实际将其集成到Web应用程序中的扩展(例如类似于Ninject.Web.Common)
从旧的ASP.NET MVC解决方案的代码看,我意识到整个机制是不同的,因为它依赖于经典的机制,WebActivatorEx.PreApplicationStartMethod并且WebActivatorEx.ApplicationShutdownMethodAttribute在ASP.NET Core中不再可用.
此外,旧Ninject.Web.Common程序集提供了几个用于初始化的有用类--Bootstrapper,OnePerRequestHttpModule,NinjectHttpModule:
public static void Start()
{
DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule));
DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule));
Bootstrapper.Initialize(CreateKernel);
}
Run Code Online (Sandbox Code Playgroud)
问题:有没有关于如何将Ninject集成到ASP.NET Core 2.0 Web应用程序中的示例?
我试图进入新的ASP.NET MVC 6的东西,但我很难用他们的新DI系统.我试图在线查找资源,但我找到的所有内容仅涵盖使用它的绝对最低限度.
我之前使用的是Ninject,我有几个这样工作的连线:
Bind<IDocumentStore>()
.ToMethod(c => CreateDocumentStore())
.InSingletonScope();
private static IDocumentStore CreateDocumentStore() {
// lots of initialization code, etc.
return documentStore;
}
Run Code Online (Sandbox Code Playgroud)
但到目前为止,我很难找到如何将这种行为转化为微软的新DI系统.我能找到的只是这样的例子:
services.AddTransient<IEmailSender, AuthMessageSender>();
services.AddTransient<ISmsSender, AuthMessageSender>();
Run Code Online (Sandbox Code Playgroud)
和:
services.AddMvc();
Run Code Online (Sandbox Code Playgroud)
一切似乎完全在目标服务的默认构造函数上工作.有没有办法在这个新的DI系统中产生我需要的行为?
我见过了
services.Configure<TOptions>(options => {});
Run Code Online (Sandbox Code Playgroud)
但我不清楚这是否会影响我的想法,或者它是否留给特定的行为.
众所周知在asp.net Startup类中有一个方法ConfigureServices我们可以添加自定义服务.服务通过依赖注入提供.
ASP.NET Core包含一个简单的内置控制反转(IoC)容器,默认支持构造函数注入,但可以轻松替换为您选择的IoC容器.除了松耦合优势外,DI还可以在整个应用中提供服务
我的问题是如何用我自己的IoC替换内置的IoC?
如果你有,请给我一个例子.
我已经使用 NInject 有一段时间了,现在我将在 Asp.net core 中启动一个项目。似乎NInject 不能与 Asp.net Core 一起使用。所以现在我的问题是 Asp.net core 是否像 NInject或其他 di 容器提供的那样提供任何di 模块?
asp.net-core ×5
.net ×3
asp.net ×3
c# ×3
ninject ×3
.net-core ×2
asp.net-mvc ×1
logging ×1
modelstate ×1