Tag: dependency injection

创建对象的线程中的dependency injection

如果我有一个从主应用程序启动的线程。 在此线程中生成事件。 每次生成事件时都会创建一个对象。 在该对象中需要依赖,因此我想注入该对象。 如何将此依赖性传递给创建的对象? 我是否需要向下传递depandancy(并让在线程中工作的类知道依赖性)或者是否有更好的方法来执行此操作? 我正在使用Unity btw。

Castle Windsordependency injection – 恢复现有实例的依赖关系

我有一个相当直接的场景,我试图解决,但我正在与温莎打几个砖墙 – 也许我试图以错误的方式解决问题? 我有一个名为Foo的类型如下: public class Foo { [NonSerialized] private IBar bar; public IBar Bar { get { return this.bar; } set { this.bar = value; } } public Foo(IBar bar) { } } 我以正常方式通过容器实例化: var myFoo = container.Resolve(); 依赖关系IBar在容器中注册,并在创建对象时得到解析。 既然已经创建了类型,我需要序列化它,我不想序列化IBar,因此它标有NonSerialized属性。 然后我需要反序列化对象并将其返回到它的前状态。 我如何使用Castle Windsor实现这一目标? 我已经有了一个实例,它只是缺少它的依赖项。 如果我使用Unity,我会使用BuildUp()来解决问题,但我想在这种情况下使用Castle Windsor。

确定解析实例的依赖关系 – IoC(autofac)

有没有办法确定哪个调用者/依赖项正在解析它所依赖的实例? 这就是我的想法 public class A { public A() { Console.Write(“I am being resolved by {0}”); } } public class B { public B(A a) { //Should print: A being resolved by B } } public class C { public C(A a) { //Should print: A being resolved by C } } 我猜测在多个依赖项之间共享的单个实例可能有点棘手,但我特意寻找每个依赖项解析的实例,因此在上面的示例中将有两个B实例。 FWIW,我的IoC容器是Autofac,它在MVC Web应用程序的上下文中运行

配置Ninject以返回结果列表

我正在使用Ninject解决依赖关系,它一直在游泳,直到现在。 在这个例子中,我实际上需要一个基于存储在App.config中的数据初始化的对象列表。 但是,Ninject不断返回一个空列表。 下面的代码段是我尝试过的一个例子。 我已经为一些上下文包含了类层次结构的构造函数。 public ServiceSchedulerBuilder(IList textExportServices) { _textExportService = textExportServices; } public TextExportService(IHotFolderManager hotFolder) { _hotFolder = hotFolder; } public HotFolderManager(string baseFolderPath, string defaultFileSearchPattern) { //Some IO } //In a Ninject AppModule… Kernel.Bind<IList>().ToMethod(ctx => { var services = new List(); foreach (var device in GetDevicesByEnvironment()) { var service = ctx.Kernel.Get(new ConstructorArgument(“hotFolder”, ctx.Kernel.Get( new […]

仅在应用程序启动时使用DI容器?

通常,我将在c#中使用dependency injection容器(unity),如下例所示: class SomeClass { private readonly ILogger _logger; public SomeClass() { _logger = DependencyContainer.Resolve(); } public void DoSomething() { var someOtherClass = DependencyContainer.Resolve(); someOtherClass().whatElseEver(); } } 昨天,我已经阅读了一些关于使用di容器进行正确dependency injection的文章。 在此之后,我知道我的例子非常糟糕。 这不是dependency injection,这就像服务定位器。 好的,怎么解决这个? 我认为使用构造函数注入可以轻松解决此问题: class SomeClass { private readonly ILogger _logger; private readonly ISomeOtherClass _someOtherClass; public SomeClass(ILogger logger, ISomeOtherClass someOtherClass) { _logger = logger; _someOtherClass […]

使用ModernUI + Caliburn.Micro组合重新实现WindowManager

在这里, Caliburn.Micro成功地与ModernUI合并。 但是如果我们想要使用多个窗口,我们还需要重新实现Caliburn的WindowManager才能与ModernUI一起正常工作。 怎么做到呢? 更新:(关于IoC容器/dependency injection的附加问题) 好吧,我得到它:我在这里使用了一个构造函数注入: public class BuildingsViewModel : Conductor { public BuildingsViewModel(IWindowManager _windowManager) { windowManager = _windowManager; } } 至于BuildingsViewModel从IoC容器解析,容器本身注入了IWindowManager接口的ModernWindowManager实现,因为Bootstrapper的Configure()方法中的这一行: container.Singleton(); 如果我从容器中解析对象实例,它会注入所有必需的依赖项。 像一棵树。 1)所以现在我想知道如何使用注射(带接口)替换这条线? _windowManager.ShowWindow(new PopupViewModel()); 2)如果我希望我的整个项目匹配DI模式,所有对象实例必须注入ModernWindowViewModel ,它首先从容器解析? 3)在整个项目中使用Caliburn的SimpleContainer是否可以,或者更好地使用像Castle Windsor这样的成熟框架? 我应该避免混合吗? UPDATE2: 4)将IoC容器集成到现有应用程序中需要首先创建此容器(例如,在控制台应用程序的Main()方法中),然后所有对象实例必须通过注入的依赖项从中增长?

使用IoC链接层,将较低的回调设置为较高并避免循环引用

我有一个场景,我需要一个较低层由上层控制,就像一个木偶大师拉弦。 由于一些内部事件不时生成,因此下层也将回调上层。 我正在使用SimpleInjector,我将ILower注入到Upper构造函数中。 我不能将Upper注入Lower,因为它会导致循环引用。 相反,我有一个寄存器回调函数来链接这两个层。 但是,我必须使用空检查分散我的代码。 有没有更好的方法或不同的架构来实现这种对象的链接? // an interface that transport can callback from transport to client public interface ILowerToUpperCallback { void ReplyA(); void ReplyB(); } // transport interface that client calls public interface ILower { void Test1(); void Test2(); void RegisterCallback(ILowerToUpperCallback callback); } public class Upper : ILowerToUpperCallback { private readonly ILower lower; […]

使用在startup.cs中分配的委托处理OnTokenValidated的问题

我想在ASP.NET Core 2.0中正确使用DI,以便让我的自定义方法处理在身份validation期间validationJWT令牌后触发的OnTokenValidated事件。 下面的解决方案有效, 除了在处理程序中我使用一个注入的服务来命中MemoryCache来检查控制器中其他位置添加的缓存项(我已经validation它们已被添加和保留),并且当它被访问时,缓存是总是空的。 我怀疑这是因为我的自定义处理程序对象是由不同的容器创建的(由于早期的BuildServiceProvider()调用?)并且正在使用MemoryCache (或类似的)的单独实例。 如果是这种情况,我想我不清楚如何在startup.cs中的ConfigureServices()中正确添加和引用我的类和方法,以便它按预期工作。 这就是我所拥有的: public void ConfigureServices(IServiceCollection services) { services.AddMemoryCache(); … services.AddScoped(); // add other services … var sp = services.BuildServiceProvider(); services.AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, bOptions => { // Configure JwtBearerOptions bOptions.Events = new JwtBearerEvents { OnTokenValidated = sp.GetService().JwtTokenValidated }; } 我的自定义处理程序类如下。 ValidateSessionAsync()调用使用注入的AppSessionService访问MemoryCache对象并确保存在缓存条目: public class JwtTokenValidatedHandler : IJwtTokenValidatedHandler { AppSessionService _session; public JwtTokenValidatedHandler(AppSessionService […]

如何使用Ninject Conventions Extension进行绑定?

我喜欢使用Ninject自动绑定绑定波纹管代码。 是否可以在单个项目中同时使用手动和自动绑定? 让我们采取波纹管手动绑定,我希望通过自动绑定实现。 请告诉我如何实现这一目标。 kernel.Bind().ToSelf().InRequestScope(); kernel.Bind<IUnitOfWork>().To<UnitOfWork>(); Bellow所有接口都inheritance自基础接口: IRepository 3。 kernel.Bind().To(); 4。 kernel.Bind().To(); 5。 kernel.Bind().To().WithConstructorArgument(“apikey”, AppSettingsManager.GetSmsApiKey) 额外 我是否需要为多个类编写.Exclude()如果我需要这样做的话 .Exclude() .Exclude() .Exclude() ? 并且对于1和2是否需要单独的手动绑定? 或者1可以使用BindToSelf()’ and .Configure(b => b.InRequestScope())`完成?

entlib无效的TraceListenerData类型

我为Enterprise Library 5 Logging Block创建了一个自定义侦听器,它由配置编辑器识别,但会抛出运行时配置exception: 尝试使用自定义记录器 static IUnityContainer _container; static LogWriter _writer; static IServiceLocator _locator; public static void Inf(string message) { if (_container == null) { // Create the container _container = new UnityContainer(); // Configurator will read Enterprise Library configuration // and set up the container var configurator = new UnityContainerConfigurator(_container); // Configuration source […]