Tag: dependency injection

使用.NET Core中的字符串(配置文件)进行ServiceCollection配置

有没有办法在.net核心的标准Microsoft.Extensions.DependencyInjection.ServiceCollection库中配置dependency injection,而实际上没有对相关实现类的引用? (从配置文件中获取实现类名?) 例如: services.AddTransient(“The.Actual.Thing”);// Where The.Actual.Thing is a concrete class

Autofac终身范围装饰器

我正在使用Autofac实现一个命令处理程序模式,并使用它的decorator工具处理交叉切割问题,如日志记录,身份validation等。 我还有依赖项,我只希望作用于请求/响应管道的生命周期。 我在下面有一个示例实现: public class Program { public static void Main() { var builder = new ContainerBuilder(); builder.RegisterAssemblyModules(typeof(HandlerModule).Assembly); builder.RegisterType().AsSelf() .InstancePerMatchingLifetimeScope(“pipline”); var container = builder.Build(); using(var scope = container.BeginLifetimeScope(“pipline”)) { var pingHandler = scope.Resolve<IHandle>(); pingHandler.Handle(new PingRequest()); } } } public class HandlerModule : Autofac.Module { protected override void Load(ContainerBuilder builder) { builder.RegisterAssemblyTypes(ThisAssembly) .As(type => type.GetInterfaces() .Where(interfaceType […]

获取在Unity中实现接口的所有类型

如果您想了解解决方案,请跳至更新: 我有一个应用程序,它使用以下代码来获取和运行许多工作方法 var type = typeof(IJob); var types = AppDomain.CurrentDomain.GetAssemblies() .SelectMany(x => x.GetTypes()) .Where(x => x.IsClass && type.IsAssignableFrom(x)); foreach (Type t in types) { IJob obj = Activator.CreateInstance(t) as IJob; obj.Run(); } 此代码完美无缺。 但是,一些较新的作业利用dependency injection来填充其构造函数,因此这种方法将无法继续使用。 所以我想知道是否有办法以统一的方式做到这一点? 我最初的想法是,我将继续上半部分,然后用解决方案替换foreach逻辑,使其看起来像下面这样。 var type = typeof(IJob); var types = AppDomain.CurrentDomain.GetAssemblies() .SelectMany(x => x.GetTypes()) .Where(x => x.IsClass && type.IsAssignableFrom(x)); foreach (Type […]

使用EF DbContext实现2个接口的dependency injection

给定一个实现2个接口的DbContext,如下所示: public interface IQueryEntities { IQueryable Users { get; } IQueryable Computers { get; } // other IQueryable get properties } public interface IUnitOfWork { int SaveChanges(); } public class MyContext : DbContext, IQueryEntities, IUnitOfWork { // implement interfaces using EF } 第一个问题,从命令方面(SaveChanges)中分离出DbContext(IDbSets)的查询方面是一个坏主意吗? 我正在探索上面的重构,因为在很多情况下我们只需要查询数据,而不保存任何内容。 我遇到的问题涉及统一DI,它目前使用IUnitOfWork接口的单个​​每个http上下文生命周期注入MyDbContext。 我不确定如何为IQueryEntities接口设置注入,以便它可以重用已经针对IUnitOfWork接口注入的现有DbContext实例。 或相反亦然。 这有可能吗? 这是当前的生命周期管理器,它在同一个http上下文中重用以前注入的IUnitOfWork实例: public class UnityHttpContextLifetimeManager : LifetimeManager { […]

Autofac:如何加载引用但未直接使用的程序集

我们使用Autofac for DI创建了一个WebApi解决方案。 我们将autofac的引导分解为一个单独的项目。 这样,我们的WebApi项目仅引用我们的Bootstrap和Contracts项目。 然后我们的引导程序引用所有其他程序集并将所有内容连接在一起。 我喜欢这种设计用于分离关注点。 我们可以按如下方式手动加载我们的程序集 – 其中我们的“AutofacModule”类包含注册每个模块(程序集)的必要信息。 ContainerBuilder builder = new Autofac.ContainerBuilder(); builder.RegisterModule(new Business.AutofacModule()); builder.RegisterModule(new Data.AutofacModule()); builder.RegisterModule(new Services.AutofacModule()); etc… 这有效,但需要对每个程序集进行硬编码。 我们试图使这个动态化,以便我们可以循环遍历所有引用的程序集,如下所示。 var assemblies = BuildManager.GetReferencedAssemblies().Cast(); foreach (var assembly in assemblies) { builder.RegisterAssemblyModules(assembly); } 这应该有效,但不行。 问题是.Net确定在引导程序项目中实际上没有使用各种程序集而不加载它们(试图优化?)。 所以我们的一些程序集从未加载过。 我还尝试了以下循环bin目录来查找所有程序集。 但是,在编译期间,.Net不会将未引用的程序集移动到bin目录中,因此它们也不存在。 string assemblyPath = System.IO.Path.Combine( System.AppDomain.CurrentDomain.BaseDirectory, “bin”); var allAssemblies = new List(); foreach (string dll […]

注册没有特定构造函数签名的控制器时,已添加具有相同键的项

这真的很奇怪。 有一个使用Autofac 3.3的MVC 5应用程序,当我添加一个没有特定构造函数签名的新控制器时,抛出An item with the same key has already been added的An item with the same key has already been added错误。 我该如何调试呢? 如果构造函数如下所示,那么当我导航到该控制器的url时,它会加载正常: public class ProductController : Controller { private readonly IServiceManager _serviceManager; public ProductController(IServiceManager serviceManager) { _serviceManager = serviceManager; } } 但是如果我添加一个没有构造函数,无参数构造函数或其他各种签名的新控制器并导航到它爆炸的特定URL: public class QuestionController : Controller { // explodes public QuestionController() { […]

C#dependency injection运行时(动态)注册

我正在使用VS 2017和.NET Core。 使用dependency injection,我想在运行时动态注册我的服务。 我的目标是编写我的服务实例,在不同的程序集中实现服务接口。 然后将servicename /程序集名称添加到某种配置文件(或db表)中。 我的注册码会做这样的事情: var ServiceTypeName = LoadServiceAssembly(AssemblyName); var serviceProvider = new ServiceCollection() .AddTransient() // <— Goal .BuildServiceProvider(); var logger = serviceProvider.GetService(IDILogger); 显然,AddTransient行不起作用,因为这样的方法不存在。 然而,它确实描绘了这个想法。 我想通过字符串名称注册类型,以便每次添加新服务类型时都不需要重新编译加载器应用程序。 我似乎无法找到如何做到这一点。 欢迎大家提出意见。 TIA

DI容器中的洋葱结构和登记依赖性

我一直在阅读Onion架构,我认为这是一个简单的问题,关于如何为DI容器安排程序集依赖性以便能够连接所有内容。 假设一个非常简单的解决方案,具有以下结构: UI => BL <= DAL 因此UI和DAL引用BL,但彼此不了解。 还假设BL有一个名为IDatabaseService的接口,它由DALDatabaseService在DAL中实现。 容器(可能)将在UI的入口点配置。 由于UI不了解DAL,如何注册IDatabaseService以解析DALDatabaseService?

一个用于dependency injection的框架(在MVC应用程序中)和简单的AOP任务(使用属性)

我已经到了想要在我的ASP.NET应用程序中完成2个任务的地步,这两个任务都可以使用一些AOP框架来完成,但它们都具有不同的性质: 我的控制器和服务的dependency injection 我创建了自定义属性NotNullAttribute并用它标记了一些方法的参数或属性,而不是抛出ArgumentNullException如果这些参数或属性为null。 我希望AOP框架在编译时检查这些属性,并添加throw原因。 示例如下: //original code that I write public void MyMethod([NotNull]string param1){ //do something } 。 //code actually being compiled – after AOF processing/weaning public void MyMethod(string patam1){ if(param1 == null){ throw new ArgumentNullException(“param1”); } //do something } 所以我想要框架(甚至不一定是AOP,但我想它必须是),这将允许我简单地完成这两项任务。 我有一些额外的要求: 占地面积小,1或2个组件 集成到VS – 我只想按Ctrl+F5进行编译,框架可以正常工作,注入依赖项,添加exception抛出代码, 而我甚至不知道它。 我不想从命令行或类似的东西运行预编译。 exception抛出代码生成我喜欢写类。 像常规方面一样。 不是XML,没有配置(可以接受约定)。 对于dependency injection,我也更喜欢类,但XML或其他配置文件是可以接受的,但它应该足够简单,以供那些不真正了解XML并且不喜欢它的人使用。 有一些这样的框架吗? […]

使用Simple Injector进行方法级别的属性拦截

使用Unity,我可以快速添加基于属性的拦截 public sealed class MyCacheAttribute : HandlerAttribute, ICallHandler { public override ICallHandler CreateHandler(IUnityContainer container) { return this; } public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext) { // grab from cache if I have it, otherwise call the intended method call.. } } 然后我这样注册Unity: container.RegisterType( new ContainerControlledLifetimeManager(), new Interceptor(), new InterceptionBehavior()); 在我的存储库代码中,我可以选择性地装饰要缓存的某些方法(具有可以为每个方法单独定制的属性值): [MyCache( Minutes = 5, CacheType […]