Tag: dependency injection

为通用接口配置装饰器,并使用Simple Injector中的非通用接口参数将所有实例注入构造函数

我一直在使用与这篇优秀文章中描述的模式非常相似的模式,将命令和查询作为对象。 我也使用SimpleInjector作为DI容器。 唯一显着的区别是,控制器对某些ICommandHandler采取显式依赖关系。我希望控制器依赖于一个对象(一个Dispatcher ),该对象将接受一个ICommand实例并解析该命令的正确处理程序。 这将减少构造函数需要采用的参数数量,并使整个事物更容易使用。 所以我的Dispatcher对象构造函数如下所示: public CommandAndQueryDispatcher(IEnumerable commandHandlers, IEnumerable queryHandlers) { } 我的CommandHandler接口如下所示: public interface ICommandHandler : ICommandHandler where TCommand : ICommand { void Execute(TCommand command, ICommandAndQueryDispatcher dispatcher); } public interface ICommandHandler { void Execute(object command, ICommandAndQueryDispatcher dispatcher); } 典型的命令处理程序如下所示: public abstract class CommandHandlerBase : ICommandHandler where TCommand : ICommand { public abstract void […]

使用NInject在WPF中注入没有无参数构造函数的viewmodel类

我正在使用NInject来解析我的第一个WPF应用程序的依赖项。 以下是我的代码片段。 我的App.xaml.cs就像。 public partial class App : Application { private IKernel container; protected override void OnStartup(StartupEventArgs e) { base.OnStartup(e); ConfigureContainer(); ComposeObjects(); } private void ComposeObjects() { Current.MainWindow = this.container.Get(); } private void ConfigureContainer() { this.container = new StandardKernel(); container.Bind().To(); } } App.xaml是这样的。 MainWindow.xaml。 MainWindow.xaml.cs public partial class MainWindow : Window { public MainWindow() { […]

使用RegisterInitializer连接事件处理程序

我有一个WCF服务,它使用Simple Injector进行dependency injection。 我想在容器引导程序中连接一些事件处理程序。 我创建了一个接口IStatusChangeNotification : public interface IStatusChangeNotification { event EventHandler JobStatusChange; } 我的CommandHandler实现了IStatusChangeNotification并且有两个事件处理程序类EmailNotification和MmrNotification ,每个类定义一个Notify()方法。 然后在我的引导代码中,我有以下内容: container.Register(); container.Register(); container.RegisterManyForOpenGeneric(typeof(ICommandHandler), Assembly.GetExecutingAssembly()); container.RegisterInitializer(scn => { scn.JobStatusChange += container.GetInstance().Notify; scn.JobStatusChange += container.GetInstance().Notify; }); 这有效,并收到通知。 我的问题是,这是否是连接事件处理程序的正确/最佳方法? 如何在请求结束时删除处理程序并且无法删除它们会导致内存泄漏?

如何在ASP.NET MVC Web App中使用Ninject?

我已经创建了一个新的MVC Web应用程序,并且我引用了Ninject.dll,Ninject.Web.Common.dll和Ninject.Web.MVC.dll。 的Global.asax.cs: public class MvcApplication : NinjectHttpApplication { public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new HandleErrorAttribute()); } public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute(“{resource}.axd/{*pathInfo}”); routes.MapRoute( “Default”, // Route name “{controller}/{action}/{id}”, // URL with parameters new { controller = “Home”, action = “Index”, id = UrlParameter.Optional }); } protected override IKernel CreateKernel() { var kernel […]

如何使用Autofac来解析Nancy创建的子生命周期范围中的类型的每个请求依赖项的实例

我们在Windows服务中托管了多个应用程序,这些应用程序自我托管Nancy端点,以便公开有关应用程序操作的检测。 我们使用Autofac作为我们的IOC。 几个存储库在所有应用程序共享的核心DLL中注册到根容器中; 然后使用从Nancy.Autofac.Bootstrapper派生的引导程序将此容器作为其容器传递给Nancy。 我们发现,当Nancy收到Web请求时,它会从根容器中解析对存储库的请求,这会导致内存被非垃圾收集的IDisposable消耗,因为根容器不会超出范围(它有Windows服务的生命周期)。 这导致服务“泄漏”内存。 然后,我们切换到一个模型,在我们的南希引导程序中,我们使用InstancePerRequest在重写的ConfigureRequestContainer()方法中添加了存储库的注册: protected override void ConfigureRequestContainer(ILifetimeScope container, NancyContext context) { base.ConfigureRequestContainer(container, context); PerRequestContainerBuilder().Update(container.ComponentRegistry); } private static ContainerBuilder PerRequestContainerBuilder() { var builder = new ContainerBuilder(); // Dependency for repository builder.RegisterType().InstancePerRequest().As(); // Repository builder.RegisterType().InstancePerRequest().As(); return builder; } 我们还重写CreateRequestContainer()方法以使用标记MatchingScopeLifetimeTags.RequestLifetimeScopeTag创建请求容器。 protected override ILifetimeScope CreateRequestContainer(NancyContext context) { return ApplicationContainer.BeginLifetimeScope(MatchingScopeLifetimeTags.RequestLifetimeScopeTag); } 这似乎解决了IDisposable没有被处理的问题 – 子请求容器被放置在Web请求管道的末尾,并且由它解析的对象也被处理并最终被垃圾收集。 我们的问题是,这似乎是将存储库的实现细节泄漏到服务中,因为我们不仅要在ConfigureRequestContainer()注册存储库,还要注册存储库所需的任何其他对象,即如果我们想要更改实现我们必须“遍历依赖链”以使用它在每个服务中注册所需的对象 – […]

无法解析从外部DLL加载的控制器

我正在使用MVC4 Web API构建一个Web API,其中包含一个IoC容器(在这种情况下是简单注入器,但我不认为这个问题与该容器有关),它应该公开各种CRUD和查询操作。 在我的案例中使用IOC的原因是我们是一个开发商店,我需要能够让客户构建自己的Web API控制器,以暴露他们需要从我们的系统公开需要的数据。 因此,我希望设计我的解决方案的方式允许我通过IOC制作所有控制器,包括我们和我们的客户,外部和可加载的产品。 该网站没有任何对该库的引用,但该库包含我想在网站中使用的控制器。 类型在容器中注册,DependencyResolver设置为自定义依赖项解析程序。 我有代码找到dll插件并加载控制器类型,但当我尝试导航到它将代表它的路线时说它无法找到它。 即如果我尝试导航到/ api / Test1Api我应该看到文本“hello world” 我的问题是虽然我已经加载了我的控制器类型,但我无法将其转换为网站所说的路线。 我收到了错误 未找到与请求URI匹配的HTTP资源 未找到与名为“Test1Api”的控制器匹配的类型。 这是我如何注册容器 public static class SimpleInjectorInitializer { /// Initialize the container and register it as MVC3 Dependency Resolver. public static void Initialize() { //// Did you know the container can diagnose your configuration? Go to: http://bit.ly/YE8OJj. // […]

是否可以在AutoFac中获取容器类型

例如,我在System.Type类型的构造函数中使用一个参数注册了类C1。 我有另一个类(C2),注入参数类型为C1。 我想在C1构造函数中自动接收typeof(C2) 。 有可能吗? 示例代码: public class C1 { public C1(Type type) {} // … } public class C2 { public C2(C1 c1) {} // … } // Registration containerBuilder.Register(???); containerBuilder.Register();

在跨平台(Xamarin)应用程序中使用哪种IoC continer?

我正在ASP.NET中为Windows,OSX,iOS,Windows Mobile,Android和Web构建跨平台应用程序。 对于每个客户端我都使用C#(我正在使用Xamarin)。 单一VS解决方案中的一切。 我的核心代码(域)在类库(可移植)中 ,因此可以在每个UI(客户端)中使用。 我想在该项目中使用IoC容器,这是我的问题:我不知道我会选择IoC,是否适用于每个客户端。 我知道例如Ninject在便携式类库中不起作用 – 这样的项目有Ninject.Portable 。 这让我想到,我选择的IoC可能无法在我的一个客户端工作,这将是不好的。 所以,我的问题是: 在Visual Studio 2015中可以在便携式类库和每个客户端(UI)中使用哪些IoC容器? 我对Simple Injector感兴趣,但现在我有这些疑虑。

如果不能使用dependency injection怎么办?

在经过多次踢和尖叫之后,我开始接受DI,尽管随着依赖关系的增长,SL看起来更加清晰。 然而,对于DI来说,IMO仍然有一个显着的阻碍: 当您无法控制对象的实例化时,DI是不可能的。 在ASP.NET世界中,示例包括:HttpModule,HttpHandler,Page等。 在上面的场景中,我们将使用静态服务位置来解析依赖关系,通常是通过HttpContext.Current ,它总是从当前线程推断出范围。 所以,如果我们要在这里使用静态SL,那么为什么不在其他地方使用它呢? 答案很简单:咬牙并在必要时使用SL(如上所述),但尝试并支持DI? 如果是这样的话:一次性使用静态SL可能会破坏整个应用程序的一致性吗? 基本上在其他地方撤消DI的辛勤工作?

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 […]