Tag: dependency injection

如果实现接口调用Dispose,它是否是一个漏洞抽象

考虑以下代码: public class MyClass() { public MyClass() { } public DoSomething() { using (var service = new CustomerCreditServiceClient()) { var creditLimit = service.GetCreditLimit( customer.Firstname, customer.Surname, customer.DateOfBirth); } } } 我们现在想重构它以松散地耦合它。 我们最终得到这个: public class MyClass() { private readonly ICustomerCreditService service; public MyClass(ICustomerCreditService service) { this.service= service; } public DoSomething() { var creditLimit = service.GetCreditLimit( customer.Firstname, customer.Surname, […]

Unity:更改默认生命周期管理器以进行隐式注册和/或禁用它们

Unity容器将自动解析它可以自己解决的任何类型,而无需手动注册。 这在某些方面很好,但我遇到的问题是它使用TransientLifetimeManager进行这种类型的分辨率,而我几乎总是想要一个ContainerControlledLifetimeManager 。 当然,我仍然可以手动将我的类型注册为单身人士,但如果我忘了,而不是在启动时获得未处理的exception,应用程序将成功启动,一切似乎都会起作用。 但是最终会出现一些错误,可能是非常微妙的,难以诊断的错误,因为有一个类型的多个实例是一个单例。 所以我的问题是:有没有办法可以指定不同的默认生命周期管理器或完全禁用默认的自动解析行为,并将容器限制为我自己注册的类型(直接或通过我自己的约定)?

我应该如何使用IoC /dependency injection处理我的实体/域对象?

我目前正在使用PLINQO从数据库生成我的所有实体。 最近,我开始使用StructureMap进行dependency injection,并将其作为“分离我的顾虑”的学习过程的一部分。 我注意到所有生成的Entity类都包含使用EntitySet的高度耦合属性,EntitySet是LINQ的一部分,它使我的实体依赖于使用System.Data.Linq。 我想继续使用我的PLINQO生成实体,但与此同时,我觉得我应该生成某种基类/仅数据对象,甚至可能将它们移动到不同的程序集中,然后使用某种自动映射器可根据需要在两者之间进行转换。 最好(或最糟糕的,取决于你如何看待它),我想要一些接口来表示这些,以便我可以在以后注入不同的具体类型。 这有点矫枉过正吗? 最终,我将不再使用SQL Server直接使用Web服务,我怀疑这些EntitySets会轻易地通过网络。 有没有人有一些很好的例子来处理这样的场景? TIA

使用Castle Windsor在基类中注入原始属性

我有以下接口定义: public interface ICommandHandler { ILogger Logger { get; set; } bool SendAsync { get; set; } } 我有多个实现ICommandHandler实现,需要解决。 当Castle Windows自动注入Logger属性时,当注入ILogger时,我无法找到一种方法来配置在创建新实例期间Windsor将SendAsync属性设置为true。 UPDATE 命令处理程序实现从基接口inheritance的通用接口: public interface ICommandHandler : ICommandHandler where TCommand : Command { void Handle(TCommand command); } 这是我的配置: var container = new WindsorContainer(); container.Register(Component .For<ICommandHandler>() .ImplementedBy()); container.Register(Component .For<ICommandHandler>() .ImplementedBy()); container.Register(Component .For<ICommandHandler>() .ImplementedBy()); Castle Windsor有什么方法可以做到这一点?

为什么在Log4Net中命名了logger?

我一直在研究使用Castle Windsor将Log4Net ILog注入类的方法。 在大多数例子中,我看到Castle Windsor可以提供一个提供属性注入的“辅助器”,并注入ILogger(而不是ILog)。 我只找到了一个使用构造函数注入的示例,并且未使用辅助方法(请参阅Castle Windsordependency injection:使用调用方类型作为参数 ) 在所有这些示例中,似乎Log4Net想要一个命名的记录器。 大多数示例引用Log4Net静态方法LogManager.GetLogger(此处为类名)。 这使得在不使用reflection或辅助方法的情况下定义CastleWindsor的依赖性是一个挑战(辅助方法可以与ctor注入一起使用)。 在查看Ilya Kogan的问题(上面的URL …)时,我想我不明白为什么需要,甚至想要一个命名的记录器。 我不能在任何地方使用同名的记录器吗? 例如,我不能只用硬编码的XXX名称注册记录器吗? (它似乎工作正常,最后,我只想记录 – 我不关心哪个记录器记录它…)是否存在范围问题? 是否存在内存泄漏问题? 为什么记录器不能/不应该是单件? public void Install(IWindsorContainer container, IConfigurationStore store) { container.Register( Component.For().UsingFactoryMethod(() => log4net.LogManager.GetLogger(“xxx”)) ); } 更新: 经过一些研究,可以使用硬编码的命名记录器 – 例如上面示例中的XXX,但是如果记录器的配置将记录器名称输出到日志文件,并且记录器名称是动态分配给与方法相同的名称,或者class,您自动获取对日志来源的引用。 日志文件中的上下文可能非常有用。 当专门针对ctor注射时,似乎有5种可能的选择…… 使用单例而不使用命名记录器(因此不会在日志文件中报告) 使用ctor注射reflection(如Ilya Kogan的例子中所示) 使用财产注入(通过协调人) 使用后尖锐的AOP IL Injection进行记录 使用CTOR注射(通过促进者)

应该如何使用IAppBuilder.CreatePerOwinContext ?

我对如何使用OWIN CreatePerOwinContext方法感到困惑。 据我所知,这是一个糟糕的勒芒机制。 然而,我没有看到如何使用它。 我们可以在Startup序列中注册一个类型/实现,如: app.CreatePerOwinContext(() => { return new UserService() as IUserService; }); 然后我们如何在以后解决这个问题。 文档说它可以通过Get方法检索。 但Get需要一个字符串参数,这是Enviornment IDictionary中该条目的关键? 在这种情况下,我怎么知道钥匙? IUserService userService = context.Get(???);

.net核心石英dependency injection

如何在.net内核中配置Quartz以使用dependency injection? 我使用标准的.net核心依赖机制。 在实现IJob的类的构造函数中,我需要注入一些依赖项。

如何在不引用程序集(或其中的类型)的情况下使用Ninject Conventions扩展

对于这个长期的问题,提前抱歉,这很长,因为我整天都在挖掘这个问题。 一般问题: 我有一个ASP.Net MVC2应用程序,其中包含以下项目:MyApp.Web,MyApp.Services,MyApp.Data。 我们对接口进行编码并将Ninject 2用于DI / IoC。 但是,我对打字(并忘记输入)感到非常厌倦: Bind.To; 所以,了解Ninject.Extensions.Convensions,我试图用它来自动扫描和注册模块和IXxxx => Xxxx类型的简单依赖项。 我试过的是有效的(但还不够): 我可以使用以下代码来设置Ninject,并且所有内容似乎都按预期连接。 public static IKernel Initialize() { var kernel = new StandardKernel(); kernel.Scan(a => { a.FromAssemblyContaining(); a.FromAssemblyContaining(); a.AutoLoadModules(); a.BindWithDefaultConventions(); a.InTransientScope(); }); return kernel; } 我想要完成的事情: 但是……我想以一种我认为支持的方式更进一步,但我似乎无法让它发挥作用。 由于我们的MyApp.Web项目根本没有使用MyApp.Data(直接),我试图避免引用MyApp.Data。 使用上面的代码,我必须从MyApp.Web引用MyApp.Data,因为对SomeDataClass的编译时引用。 我更愿意为Ninject指定一个程序集的名称进行扫描和注册。 看来,Conventions扩展通过From过载来支持这个,它带有一个字符串(或可枚举的字符串)。 我尝试了什么以及它如何打破: 所以,我在From重载上尝试了几种变体: public static IKernel Initialize() { var kernel = new StandardKernel(); […]

使用Unity注入数组

我的目标是构造函数注入实现接口的对象数组。 以下是我目前的方式。 Container .RegisterInstance(ParseCompany(args[1]) .RegisterInstance(ParseTargets(args[2])) .RegisterInstance(new ILoader[] { Container.Resolve(), Container.Resolve<PaymentLoader(), Container.Resolve<InvoiceLoader() }); 以这种方式在容器配置中调用Resolve是典型的,还是有更标准的方法来完成同样的事情?

dependency injection,注入参数

我正在使用DI的vNext实现。 如何将参数传递给构造函数? 例如,我有课: public class RedisCacheProvider : ICacheProvider { private readonly string _connectionString; public RedisCacheProvider(string connectionString) { _connectionString = connectionString; } //interface methods implementation… } 和服务注册: services.AddSingleton(); 如何将参数传递给RedisCacheProvider类的构造函数? 例如Autofac: builder.RegisterType() .As() .WithParameter(“connectionString”, “myPrettyLocalhost:6379”);