Tag: dependency injection

工厂模式与开放的generics

在ASP.NET Core中,您可以使用Microsoft的dependency injection框架执行的操作之一是绑定“open generics” (未绑定到具体类型的generics类型),如下所示: public void ConfigureServices(IServiceCollection services) { services.AddSingleton(typeof(IRepository), typeof(Repository)) } 您还可以使用工厂模式来水合依赖项 。 这是一个人为的例子: public interface IFactory { T Provide(); } public void ConfigureServices(IServiceCollection services) { services.AddTransient(typeof(IFactory), typeof(Factory)); services.AddSingleton( typeof(IRepository), p => p.GetRequiredService<IFactory<IRepository>().Provide() ); } 但是,我还没弄清楚如何将这两个概念结合起来。 看起来它会从这样的东西开始,但我需要用于水合IRepository实例的具体类型。 public void ConfigureServices(IServiceCollection services) { services.AddTransient(typeof(IFactory), typeof(Factory)); services.AddSingleton( typeof(IRepository), provider => { // Say the IServiceProvider […]

entity framework:在运行时更改连接字符串

假设有一个ASP.NET MVC应用程序使用Entity Framework 6,代码优先方法和StructureMap作为IoC。 它还使用工作单元模式。 以下是代码: 域类 public class Product { public int Id { get; set; } public string Name { get; set; } public decimal Price { get; set; } } IUnitOfWork和DbContext: public interface IUnitOfWork { IDbSet Set() where TEntity : class; int SaveChanges(); } public class Sample07Context : DbContext, IUnitOfWork { public […]

.NET Framework中的控制和dependency injection反转

是否有任何特定的DI示例/实例作为.NET Framework本身的架构原则或设计模式应用? 框架/ BCL中的任何(或许多)类型是否符合IoC? 基于C#的类型名称和简要说明/解释会很棒! 这将使DI注入设计原则成为最佳实践的必要性……因为它是从基础框架本身收集的。 我重申,我不是在为框架中的IoC / DI寻找IoC / DI框架。 编辑:只是想得到更多的实例/例子…因此赏金!

注入存储库上的IDisposable

我有以下ADO .Net存储库 public class Repository : IRepository, IDisposable { private readonly IUnitOfWork UnitOfWork; private SqlConnection Connection; public Repository(IUnitOfWork unitOfWork, connectionString) { UnitOfWork = unitOfWork; Connection = new SqlConnection(connectionString); Connection.Open(); } public MyObject FindBy(string userName) { //…Ado .Net command.ExecuteReader, etc. } } 此存储库向IOS容器注入域服务,使用方式如下: public class UserDomainService : IUserDomainService { private readonly IRepository Repository; public UserDomainService(IRepository repository) […]

JavaScript DI / IoC等同于静态类型语言的标准DI模式

.NET和Java都有大量的DI / IoC容器可供它们使用,每个容器都有许多模式,我发现这些模式在处理它们的各个方面非常有用。 我现在正想在JavaScript中做同等的事情。 由于JavaScript是一种动态语言,我不希望DI / IoC容器直接等同于静态类型语言中容器提供的所有function,因此欢迎使用这些模式的替代方案。 我还希望JavaScript中提供的DI / IoC容器的function会有所不同,因此对不同容器的引用非常受欢迎。 以下模式是Autofac 3支持的模式 ,我认为这些模式适用于动态语言。 有关这些模式和关系的一般信息,请参阅http://autofac.readthedocs.org/en/latest/resolve/relationships.html和http://nblumhardt.com/2010/01/the-relationship-zoo/ 。 以下概念中的大多数(如果不是全部)也可以使用其他语言和DI / IoC容器,例如Google Guice和Spring 。 与JavaScript中下面描述的概念和模式最接近的等价物是什么? 一般概念 概念1:向IoC容器注册 在IoC容器可以创建类型的实例之前,它需要知道类型。 这是通过注册完成的。 注册通常以声明方式完成: class A {} var builder = new ContainerBuilder(); builder.RegisterType(); 上面使IoC容器知道类型A.它通过reflection发现A的依赖性。 注册也可以通过充当工厂的function进行。 这些函数通常是lambdas,可以内联编写: class B {} class A { A(string name, B b) { } } builder.RegisterType(); builder.Register(c => // […]

Web API中的依赖项注入validation

在MVC中,我可以创建一个可以使用依赖关系的模型validation器。 我通常使用FluentValidation。 例如,这允许我检查帐户注册是否未使用电子邮件地址(注意:这是一个简化的示例!): public class RegisterModelValidator : AbstractValidator { private readonly MyContext _context; public RegisterModelValidator(MyContext context) { _context = context; } public override ValidationResult Validate(ValidationContext context) { var result = base.Validate(context); if (context.Accounts.Any(acc => acc.Email == context.InstanceToValidate.Email)){ result.Errors.Add(new ValidationFailure(“Email”, “Email has been used”)); } return result; } } 使用FluentValidation的Web API不存在此类集成。 已经有过几次 尝试 ,但都没有处理dependency injection方面,只能使用静态validation器。 这很困难的原因是由于MVC和Web […]

Caliburn Micro构造函数注入失败

我正在学习Caliburn Micro并尝试使用官方网站上的EventAggregator 。 但是,我得到了一个例外 “没有为此对象定义无参数构造函数。” 消息本身很清楚,但示例中也没有包含无参数构造函数。 如果我添加一个,带有参数的构造函数不会被命中, IEventAggregator仍未正确注入。 添加无参数构造函数后,这是我的发布者VM(没有它,将抛出exception): public MainViewModel() { } public MainViewModel(IEventAggregator ea) : this() { eventAggregator = ea; } 这是我正在使用的引导程序: public class AppBootstrapper : Bootstrapper { private readonly SimpleContainer container = new SimpleContainer(); protected override void Configure() { container.Singleton(); } } 这是CM的例子: // Creating the EventAggregator as a singleton. public class […]

三层asp.net mvc应用程序中的dependency injection

我有一个3层应用程序,层是: Web:表示层(ASP.NET MVC) – >只能看到BLL BLL:业务逻辑层 – >只能看到DAL DAL:数据访问层 因此, Web层对我的DAL层一无所知。 我在DAL有存储库接口和具体类,它们在业务逻辑类的BLL层中使用。 问题是,为了解耦DAL和BLL ,如何设置Ninject以将我的存储库实现注入BLL层? 同样的问题是Web层和BLL层,我在BLL上有接口和实现,我在Web层使用它们,我应该如何为此设置Niject?

structuremap – 同一接口的两个实现

我有一个服务类与以下ctor: public class (IMessageService emailService, IMessageService smsService) { … } 以及IMessageService (电子邮件和短信)的两种实现。 如何配置容器以正确解析此构造函数? 这是命名实例进入的地方,还是另一种情况?

dependency injection选择

我正在寻找dependency injection,我可以看到它的好处,但我遇到了它创建的语法问题。 我有这个例子 public class BusinessProducts { IDataContext _dx; BusinessProducts(IDataContext dx) { _dx = dx; } public List GetProducts() { return dx.GetProducts(); } } 问题是我不想写 BusinessProducts bp = new BusinessProducts(dataContextImplementation); 我会继续写 BusinessProducts bp = new BusinessProducts(); 因为我觉得第一种选择只是感觉不自然。 我不想知道BusinessProduct“依赖”什么来获取产品,我也觉得它使我的代码更难以理解。 是否有任何替代方法,因为我希望保留我创建对象的原始语法,但我希望仍然能够在unit testing时伪造依赖关系,或者这个dependency injection框架可以为我做什么? 我在c#编码,但欢迎其他语言的替代品