Tag: dependency injection

如何配置Simple Injector以在ASP.NET MVC中运行后台线程

我正在使用Simple Injector来管理我注入的依赖项的生命周期(在本例中为UnitOfWork ),我很高兴有一个单独的装饰器而不是我的服务或命令处理程序,在保存和处理之后,在编写业务时使代码更容易逻辑层(我遵循本博文中概述的架构)。 通过在构造根容器的构造过程中使用Simple Injector MVC NuGet包和以下代码,上面的工作完美(并且非常容易),如果图中存在多个依赖项,则相同的实例将全部注入 – 完美的entity framework模型上下文。 private static void InitializeContainer(Container container) { container.RegisterPerWebRequest(); // register all other interfaces with: // container.Register(); } 我现在需要运行一些后台线程,并从Simple Injector 文档中了解可以代理命令的线程 ,如下所示: public sealed class TransactionCommandHandlerDecorator : ICommandHandler { private readonly ICommandHandler handlerToCall; private readonly IUnitOfWork unitOfWork; public TransactionCommandHandlerDecorator( IUnitOfWork unitOfWork, ICommandHandler decorated) { this.handlerToCall = decorated; […]

如何在Ninject中绑定Generic类型的接口

我是Ninject的新手,在我实现通用存储库模式时发现自己陷入困境。 我想将依赖项IRepository 绑定到类ConcreteRepository ,其中ConcreteRepository 实现IRepository ,EntityType实现IEntityType。 我试过这个: kernel.Bind<IRepository>().To<ConcreteRepository>(); …但是Ninject不会接受它,因为它不知道或不关心EntityType实现IEntityType。 我怎样才能绑定这种依赖? UPDATE 这是我得到的错误: 错误3类型’ICM.Dependency.Repository.ConcreteRepository’不能在generics类型或方法’Ninject.Syntax.IBindingToSyntax.To()’中用作类型参数’TImplementation’。 没有从“ConcreteRepository ”到“IRepository ”的隐式引用转换。 解 我仍然不太明白为什么我的绑定不起作用,但显然我在那里使用generics不正确。 因此,该解决方案与NInject无关。 我结束了指定ConcreteRepository以显式连接IEntityType和TEntityType: public class ConcreteRepository : IRepository where TEntity : TInterface { … } 然后注射可以写成如下: kernel.Bind<IRepository>().To<ConcreteRepository>()

使用简单注入器的每线程和每Web请求的混合生活方式

我使用SimpleInjector作为我的IoC库。 我根据网络请求注册DbContext ,它工作正常。 但是我有一个任务是在后台线程中运行它。 所以,我有一个问题是创建DbContext实例。 例如 Service1有一个DbContext实例 DbContext有一个DbContext实例 Service1和Service2从后台线程运行。 Service1获取实体并将其传递给Service2 Service2使用该实体,但实体与DbContext分离 实际上问题在于: Service1.DbContext与Service2.DbContext不同。 看来,当我在ASP.NET MVC中的一个单独的线程中运行一个任务时, DbContext为每个调用创建一个新的DbContext实例。 虽然一些IoC库(例如StructureMap )对于每个SimpleInjector -per-webrequest具有混合生活方式,但似乎SimpleInjector没有一个。 我对吗? 你有任何想法在SimpleInjector解决这个问题吗? 提前致谢。 编辑: 我的服务在这里: class Service1 : IService1 { public Service1(MyDbContext context) { } } class Service2 : IService2 { public Service2(MyDbContext context, IService1 service1) { } } class SyncServiceUsage { public SyncServiceUsage(Service2 service2) { […]

简单的依赖性解析器

如何创建简单的依赖关系解析器,不使用任何内置或库,如Autofac,Ninject等。 这是我的面试问题。 我写了这个简单的代码,他们说它看起来不太好。 它就像非常难以编码的想法。 public interface IRepository { } interface IDataProvider { List GetData(); } public class SQLDataProvider : IDataProvider { private readonly IRepository _repository { get; set; } public SQLDataProvider(IRepository repository) { _repository = repository; } public List GetData() { return new List { “” }; } } public class MockDataProvider : IDataProvider { […]

Windsor LifeStyle – 每个图形的共享实例

我有两种类型的ViewModel public class ViewModelA { IService service; private ViewModelB childViewModel; public ViewModelA(IService service,ViewModelB childViewModel) { this.service = service; this.childViewModel = childViewModel; } public ViewModelB ChildViewModel { get { return childViewModel; } } } public class ViewModelB { IService serivce; public ViewModelB(IService service) { this.service = service; } } 我在Windsor Container注册了一项服务: public class Service : IService […]

dependency injection可以防止循环依赖吗?

项目#1有一些项目#2引用的接口和类。 现在我想在Project#1中使用Project#2的实现,但vs.net抱怨循环依赖。 如果我在Project#1中使用dependency injection并绑定到Project#2中的实现(因为它遵守接口契约),这是否可行或者我仍然会在运行时获得循环依赖性错误消息?

C#/ Unity中的构造函数注入?

我正在使用C#和Microsoft的Unity框架。 我不太清楚如何解决这个问题。 这可能与我对Unity缺乏理解DI有关。 我可以使用以下示例代码总结我的问题: class Train(Person p) { … } class Bus(Person p) { … } class Person(string name) { … } Person dad = new Person(“joe”); Person son = new Person(“timmy”); 当我在Bus上调用resolve方法时,如何确保注入名为’timmy’的Person’son’并在解析Train时如何确定具有当时名称’joe’的Person’add’得到解决? 我想也许可以使用命名实例? 但我不知所措。 任何帮助,将不胜感激。 顺便说一句,我宁愿不创建一个IPerson接口。

如何解决Autofac InstancePerHttpRequest

我在Global.asax.cs中注册了这样的组件: ContainerBuilder builder = new ContainerBuilder(); builder.RegisterControllers(Assembly.GetExecutingAssembly()); builder.RegisterType().As().InstancePerHttpRequest(); IContainer container = builder.Build(); DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); // This is where my error happens, not sure why? var workContext = container.Resolve(); WebWorkContext类: public class WebWorkContext : IWorkContext { // Left out other code } IWorkContext接口: public interface IWorkContext { // Left out other code } 我得到的错误是: 从请求实例的作用域中看不到具有匹配“httpRequest”的标记的作用域。 这通常表示注册为每HTTP请求的组件正被SingleInstance()组件(或类似场景)重新请求。在Web集成下,始终从DependencyResolver.Current或ILifetimeScopeProvider.RequestLifetime请求依赖,永远不会从容器本身请求。 […]

dependency injection与策略模式

关于这个话题的讨论很多,但每个人似乎都错过了一个明显的答案。 我想帮助审查这个“明显的”IOC容器解决方案。 各种对话假设运行时选择策略和使用IOC容器。 我将继续这些假设。 我还想补充一个假设,即它不是必须选择的单一策略。 相反,我可能需要检索一个对象图,该对象图在整个图的节点中找到了几个策略。 我将首先快速概述两个常用的解决方案,然后我将展示我希望看到IOC容器支持的“明显”替代方案。 我将使用Unity作为示例语法,但我的问题不是Unity特有的。 命名绑定 这种方法要求每个新策略都手动添加绑定: Container.RegisterType(); Container.RegisterType(“Alpha”); Container.RegisterType(“Beta”); ……然后明确要求正确的策略: var strategy = Container.Resolve(“Alpha”); 优点:简单,并得到所有IOC容器的支持 缺点: 通常将调用者绑定到IOC容器,当然要求调用者知道有关策略的信息(例如名称“Alpha”)。 必须手动将每个新策略添加到绑定列表中。 此方法不适合处理对象图中的多个策略。 简而言之,它不符合要求。 抽象工厂 为了说明这种方法,假设以下类: public class DataAccessFactory{ public IDataAccess Create(string strategy){ return //insert appropriate creation logic here. } public IDataAccess Create(){ return //Choose strategy through ambient context, such as thread-local-storage. } } public […]

使用Unity的策略模式和dependency injection

我终于忍受了Dependency Injection(早就应该); 我开始玩Unity并遇到战略模式的问题。 我可以使用容器向我返回基于名称的策略的特定实现,但我没有看到我应该如何在上下文中获得正确的策略。 让我们举一个简单的例子说明:上下文是一辆汽车,它有一个IEngine(战略),有2个实现,FastEngine和SlowEngine。 代码将沿着这些方向看: public interface IEngine { double MaxSpeed { get; } } internal class FastEngine:IEngine { public double MaxSpeed { get { return 100d; } } } internal class SlowEngine:IEngine { public double MaxSpeed { get { return 10d; } } } public class Car { private IEngine engine; public double […]