Tag: ioc container

防止Simple Injector在解析未注册的服务时抛出exception

我想知道,只要GetInstance(Of TService)返回Nothing Simple Injector是否可以选择停止抛出exception? 它现在似乎是抛出它们,因为我有两个请求来获取一个实例,它不在那里,它抛出了exception。 有没有办法防止默认行为,设置某个地方,或其他什么?

Unity – 如何将多个映射用于相同类型并注入对象

我正在使用Unity 2.0,在下面的代码中我试图在Worker对象中注入一个特定的工具。 我想使用以下代码。 但是当然有一个错误“依赖的解决方案失败了”。 我相信我应该可以做这样的事情,但我很难搞清楚。 IUnityContainer container = new UnityContainer(); container.RegisterType(“Worker”) .RegisterType(“ToolA”) .RegisterType(“ToolB”) .RegisterType(“ToolC”); IWorker worker = container.Resolve(“ToolA”); 我知道这不起作用,但我该如何解决这个问题呢? BarDev

Simple Injector:需要创建具有依赖项的类的工厂类

我有一个工厂类,可以创建几种不同类型的类。 工厂已在集装箱中注册。 在工厂内部创建类的建议方法是什么,因为它们也具有依赖性。 我显然希望避免对容器的依赖,但如果我新建这些类,那么他们将不会使用容器。 例如 public class MyFactory { public IMyWorker CreateInstance(WorkerType workerType) { if (workerType == WorkerType.A) return new WorkerA(dependency1, dependency2); return new WorkerB(dependency1); } } 所以问题是我从哪里获取这些依赖项。 一种选择可能是使它们成为工厂的依赖关系。 例如 public class MyFactory { private Dependency1 dependency1; private Dependency2 dependency2; public MyFactory(Dependency1 dependency1, Dependency2, dependency2) { this.dependency1 = dependency1; this.dependency2 = dependency2; } public IMyWorker […]

DI:处理IDisposable对象的生命

所以我正在研究我的DI / IoC容器OpenNETCF.IoC ,我有一个(合理的)function请求,为容器集合中的IDisposable项添加某种forms的生命周期管理。 我当前的想法是,因为我无法查询某个对象以查看它是否已被处置,并且我无法获得一个事件,因为它被处理掉了,我必须为开发人员想要的对象创建某种forms的包装器要管理的框架。 现在可以使用AddNew添加对象(为简单起见,我们假设只有一个重载并且没有添加): public TTypeToBuild AddNew() { … } 我正在考虑的是添加一种新方法(很好的一组,但你得到的图片): public DisposableWrappedObject AddNewDisposable() where TTypeToBuild : class, IDisposable { … } DisposableWrappedObject的位置如下所示: public class DisposableWrappedObject where T : class, IDisposable { public bool Disposed { get; private set; } public T Instance { get; private set; } internal event EventHandler<GenericEventArgs> Disposing; internal […]

StructureMap中的命名实例和默认实例?

在我的StructureMap引导代码中,我使用自定义约定来扫描程序集,并将接口/实现对作为命名实例添加到对象图中。 基本上我有一些逻辑可以检查配置设置,并根据不同的条件深入到这个语句: registry.For(interfaceType).Use(type) .Named(implementationName); 这样可以很好地添加所有命名实例。 但是,我还想在未指定实例名称的情况下添加默认实例。 但是,默认实例并不总是添加到图表中的最后一个实例。 有时在扫描期间会添加其他命名实例。 但是,似乎最后添加的任何一个实例,无论它是否被命名,都始终是默认的。 我尝试了各种流畅的API组合,包括: registry.For(interfaceType).Add(type); 要么: registry.For(interfaceType).Use(type); 甚至一些被标记为弃用的。 但最终的行为始终是最后一个是默认行为。 因此,如果添加实现的顺序是这样的: 对于Logger接口,使用名为“Log4Net”的Log4Net实现 对于Logger接口,默认使用Log4Net实现 对于Logger接口,使用名为“Mock”的Mock实现 由此产生的行为是,当未指定名称时,“Mock”实现将用作默认值。 调试容器中的AllInstances ,我按以下顺序看到: 名为“Log4Net”的Log4Net记录器实例 Log4Net记录器的一个实例,带有名称的GUID(就像我可以告诉的那样,任何其他默认实例) Mock记录器的一个实例名为“Mock” 但是,从没有实例名称的容器调用时调试到日志记录语句会导致使用Mock实现。 有没有办法将默认实例添加到对象图中,同时仍然能够在之后添加命名实例?

使用ASP.NET MVC的每个会话生活方式的Castle项目

我是Castle Windsor IoC容器的新手。 我想知道是否有一种使用IoC容器存储会话变量的方法。 我在想这个问题: 我想要一个类来存储搜索选项: public interface ISearchOptions{ public string Filter{get;set;} public string SortOrder{get;set;} } public class SearchOptions{ public string Filter{get;set;} public string SortOrder{get;set;} } 然后将其注入必须使用它的类中: public class SearchController{ private ISearchOptions _searchOptions; public SearchController(ISearchOptions searchOptions){ _searchOptions=searchOptions; } … } 然后在我的web.config中,我配置城堡我希望有类似的东西: 让IoC容器处理会话对象,而不必自己显式访问它。 我怎样才能做到这一点? 谢谢。 编辑:一直在做一些研究。 基本上,我想要的是一个会话Scoped组件。 我来自Java和Spring Framework,在那里我有会话范围的bean,我认为这对存储会话数据非常有用。

在MVC应用程序中使用IoC框架有什么用?

我试图理解像StructureMap这样的IoC框架的使用,但我不禁想到这些“设计模式”只是无意义,使代码变得更加复杂。 让我先举一个例子,我认为IoC有点用处。 我认为在处理MVC框架中控制器类的实例化时,IoC可能很有用。 在这种情况下,我正在考虑.NET MVC框架。 通常,控制器类的实例化由框架处理。 这意味着您无法将任何参数传递给控制器​​类的构造函数。 这就是IoC框架可以派上用场的地方。 在IoC容器中的某处,您可以指定在调用控制器类时应该实例化哪个类并将其传递给控制器constructor 。 当您想要对控制器进行unit testing时,这也很方便,因为您可以模拟传递给它的对象。 但就像我说的,我可以理解为什么人们想将它用于控制器类。 但不是在那之外。 从那以后,您可以简单地执行正常的dependency injection 。 但为什么不简单地这样做: public class SomeController { public SomeController() : this( new SomeObj() ) { } publiv SomeController(SomeObj obj) { this.obj = obj; } } 现在您不必使用任何第三方IoC框架,这也意味着更低的学习曲线。 既然您不必深入了解该框架的规范。 您仍然可以在unit testing中模拟对象。 所以也没问题。 你唯一可以说的是,“但现在你的class级与 SomeObj 紧密 SomeObj ”。 这是真的。 但谁在乎!? 这是一个控制器类! 我永远不会重复使用那个类..那么为什么我要担心这种紧耦合……? 我可以模拟传递给它的对象。 […]

如何在ASP.NET Web API上对Action Filter执行依赖项注入

我真的陷入了将dependency injection到web api的动作filter中的方法。 我有一个这样的动作filter: public class AuthorizationAttribute : ActionFilterAttribute { public IApiKeyRepository Repository { get; set; } private Guid GetApiKey(string customerKey) { return Repository.GetApiKey(customerKey); } public override void OnActionExecuting(HttpActionContext actionContext) { } } 我想通过使用Windsor在属性Repository上进行属性注入(但是使用哪个IoC容器并不重要) 我确实想要自定义FilterProvider,但它没有为我工作,有没有人有解决方案或运行代码? 非常感谢

带有Ninject的多个参数的构造方法

我想使用Ninject作为IoC容器,但无法理解如何在构造函数中创建一个具有多个参数的类的实例。 基本上我有一个用于PCL库中的身份validation的服务接口,以及它在WP8项目中的实现,该项目在构造函数中接收cosumer密钥,secret和baseAddress: //On PCL project public interface IAuthorizationService { bool Authenticate(); } //On WP8 Project pubilc class MyAuthenticator : IAuthorizationService { public MyAuthenticator(string consumerKey, string consumerSecret, string baseAddress) { … } public bool Authenticate() { … } } 现在我需要配置Ninject模块,以便我可以获得IAuthorizationService的实例。 如果我的class级没有构造函数,我会这样做: internal class Module : NinjectModule { public override void Load() { this.Bind().To(); } } 如果它有构造函数的固定值,我会这样做: […]

将棱镜与Ninject一起使用

是否有人在那里使用Prism框架与Ninject而不是Unity? 我需要一些Unity尚未支持的function,我决定将IoC容器切换到Ninject。 虽然我在替换中有点挣扎。 我需要从Prism使用的是EventAggregator和RegionManager。 我已经看到了这个实际上替换的示例 ,但是这是为较旧版本的Prism编写的,并且几个类似乎已经改变等等。所以我在尝试重写它之后做了一些努力后最终都感到困惑。 所以 – 我的问题基本上是: 如何用Ninject替换Unity? 有什么必要的步骤? 最初我假设我可以编写一个简单的引导程序来创建和配置Ninject容器并使用它来解析所有其他对象。 我将IEventAggregator绑定到EventAggregator并将IRegionManager绑定到RegionManager,但是在创建Shell并且调用RegionManager.CreateRegion时它会失败。 问题是,似乎我需要在某处设置ServiceLocator,因为它在此行上失败: IServiceLocator locator = ServiceLocator.Current; 一路上有什么想法和提示吗?