Tag: dependency injection

有没有替代混蛋注射? (通过默认的构造函数也是穷人的注入)

我通常很想在less数情况下使用“混蛋注射”。 当我有一个“适当的”dependency injection构造函数: public class ThingMaker { … public ThingMaker(IThingSource source){ _source = source; } 但是,对于我打算作为公共API (其他开发团队将使用的类)的类,我永远不会find一个更好的select,而不是写一个具有最可能需要的依赖性的默认“混蛋”构造函数: public ThingMaker() : this(new DefaultThingSource()) {} … } 这里明显的缺点是这会在DefaultThingSource上创build一个静态依赖关系; 理想情况下,不会有这样的依赖,消费者总是会注入他们想要的任何IThingSource。 但是,这太难使用了; 消费者希望创造一个ThingMaker并开始制作东西,然后在需要时再注入其他东西。 在我看来,这只剩下几个选项: 省略混蛋构造函数; 强迫ThingMaker的用户了解IThingSource,了解ThingMaker如何与IThingSource交互,查找或编写具体类,然后在构造函数调用中注入实例。 省略混蛋构造函数,并提供单独的工厂,容器或其他引导类/方法; 不知何故使消费者明白,他们不需要编写自己的IThingSource; 强迫ThingMaker的用户find并理解工厂或引导程序并使用它。 保持混蛋的构造函数,使消费者“新build”一个对象并运行,并应对DefaultThingSource上的可选静态依赖。 男孩,#3肯定看起来很有吸引力。 还有更好的select吗? #1或#2似乎不值得。

我可以传递构造参数到Unity的Resolve()方法吗?

我正在使用微软的Unity进行dependency injection,我想要做这样的事情: IDataContext context = _unityContainer.Resolve<IDataContext>(); var repositoryA = _unityContainer.Resolve<IRepositoryA>(context); //Same instance of context var repositoryB = _unityContainer.Resolve<IRepositoryB>(context); //Same instance of context IDataContext context2 = _unityContainer.Resolve<IDataContext>(); //New instance var repositoryA2 = _unityContainer.Resolve<IRepositoryA>(context2); RepositoryA和RepositoryB都有一个构造函数,它需要一个IDataContext参数,我希望Unity使用我传递的上下文初始化存储库。 另外请注意, IDataContext没有注册Unity(我不想要3个IDataContext实例)。

Unity将依赖关系注入到具有参数的MVCfilter类中

我正在使用Unity.MVC4dependency injection来访问我的服务。 一切工作,因为它应该注入到我的控制器构造函数时,但我想现在要做的是在我的filter类中使用属性注入 ,所以我可以从内部访问我的数据库。 在我开始这个问题之前,我search了一遍,尝试了不同的例子,但我找不到解决scheme,为我工作。 Bootstrapper.cs public static class Bootstrapper { public static IUnityContainer Initialise() { var container = BuildUnityContainer(); DependencyResolver.SetResolver(new UnityDependencyResolver(container)); return container; } private static IUnityContainer BuildUnityContainer() { var container = new UnityContainer(); container.RegisterType<IAccountRepository, AccountRepository>(); container.RegisterType<IAdministrationRepository, AdministrationRepository>(); container.RegisterType<IUploadDirectlyRepository, UploadDirectlyRepository>(); container.RegisterType<IUserRepository, UserRepository>(); container.RegisterType<INewsRepository, NewsRepository>(); container.RegisterType<IContactRepository, ContactRepository>(); // register all your components with the container […]

如何将对象注入jersey请求上下文?

我有这种情况下,我想写一个filter,我希望这个filter插入一些对象到当前的请求,并传递它,以便当资源类获取请求时,它可以使用该对象。 过滤类 @Override public void filter(ContainerRequestContext request) throws IOException { MyObject obj = new MyObject(); // Inject MyObject to request which I dont know how } 资源类 @PUT @Consumes("application/json") @Path("/") public String create( JSONParam sample, @Context MyObject obj) { System.out.println(obj.getName()); return ""; }

为什么要在内置的ASP.NET Core DI容器上使用第三方DI容器?

目前缺乏关于DI主题 – dependency injection的文档。 有人可以帮我理解以下几点: 这些注册有什么区别? public void ConfigureServices(IServiceCollection services) { services.AddTransient<IService, Service>(); services.AddScoped<IService, Service>(); services.AddSingleton<IService, Service>(); services.AddInstance(service); } (NInject,Autofac,Structure Map)等现有解决scheme使用内置DI的优缺点是什么? 什么是当前的默认dependency injection(如果有的话)的限制?

控制反转<dependency injection

我感觉到没有控制倒置这样的东西,或者说正确的术语是dependency injection。 我错了吗? 我一直试图为我自己定义IoC。 在这样做的过程中,我学到了很多关于IoC容器和dependency injection的知识。 刚才我从Martin Fowler的网站上看到这个消息: 因此,我认为我们需要一个更具体的名称为这种模式。 控制反转是一个过于笼统的术语,因此人们感到困惑。 因此,与各种IoC倡导者进行了大量的讨论,我们决定使用Dependency Injection这个名字。 现代IoC的世界是不是dependency injection只是实现IoC的一种方式?

有关使用Ninject的问题

我经历了推荐的步骤来添加Ninject到我的MVC应用程序。 我添加了一个DbContext参数给我的控制器的构造函数。 控制器: public class MyController : BaseController { public ArticlesController(MyDbContext context) : base(context) { } } 基本控制器: public class BaseController : Controller { protected DbContext MyDbContext; public BaseController(MyDbContext context) { MyDbContext = context; } } 这似乎运作良好。 但是留下了几个问题。 Ninject是否确保我的DbContext被清理并及时处理? 我为所有的应用程序的控制器创build了一个基类来处理任何常见的初始化等。基类在构造函数中接受我的DbContext参数的一个实例。 但是这需要我也将这个参数添加到我的应用程序中的每个控制器。 有没有办法不要求这个? 我不知道创build我的DbContext的实例是多么昂贵。 有没有什么办法来进行优化,只有当请求实际上需要我访问数据库时才会创build它。

不能合并工厂/ DI

假设我有一些类Foo,有两个依赖项:一个ISerializer<T>和一个IFileAccessHandler 。 现在这个类也有其他的依赖关系,函数依赖关系。 我不希望任何人在无效状态下实例化这个类,所以我也需要在构造函数中传递一个域对象。 但是我怎样才能让IoC处理,当我也知道在创buildFoo类的那一刻,什么样的域对象被传递? 我使域对象成为我由Factory设置的属性。 因此,Factory进行Service Locator调用,以获得具有相关性的正确实例化的“Foo”类,并进一步填充正确的域对象并将其返回。 但这是最好的方式吗? 我宁愿让我的构造函数的域对象部分,使其显示你真的需要与“Foo”的工作。 有任何想法吗? 我在这里错过了什么?

日志logging,面向方面的编程和dependency injection – 试图理解这一切

我知道日志logging是AOP的主要用例。 此外,还要logging日志包装器,以便您可以使用DI,以便类不会与特定的日志logging实现结合使用。 但是, 有些人认为logging包装是一种反模式 。 首先,这样的观点是因为在大多数情况下,包装往往是简单的,并删除了日志框架的许多特定的function。 如果你实现这些特定的function,为什么不直接使用框架。 我意识到Common.Logging外观试图为您抽象log4Net,EntLib,NLog的大量function。 但是,即使在这里,我们仍然对Common.Logging有各种依赖。 不是在接口等代码/unit testing方式,但如果项目死亡(自上个版本已经超过一年),或者你希望后者切换到不支持的logging器,可能会导致问题。 也就是说, 如果通过AOP来实现日志logging,甚至有必要使用DI作为日志依赖 (也就是说为什么不直接引用NLog)? 是的,代码的AOP部分将被紧密耦合,但是人们想要unit testing的类的逻辑没有日志依赖性(至less在编织发生之前)。 在这一点上,我有点失落(我还没有尝试过AOP)。 编织之后,会不会有AOP代码使用DI导致unit testing方法出现问题? 或者可以一个unit testing而不编织AOP代码? 除非日志logging是软件用户的要求,否则我不确定testing日志logging是否发生在mock中是多么有用。 我认为被测方法的业务逻辑是大多数人对testing感兴趣的。 最后,如果想要使用TDD / BDD,那么在AOP代码中不需要使用DI进行日志logging依赖关系吗? 或者只是不试驾 AOP的一面呢? 正如你所看到的,我试图去感受一下开发一个应用程序的最实际的方法是什么,这个应用程序可以同时使用AOP和横向关注以及DI进行devise/testing。 由于AOP是相对较新的,日志logging是最常见的例子,所推荐的方法是什么?

@资源vs @Autowired

在使用DI时,我应该使用哪个注解, @Resource ( jsr250 )或@Autowired (Spring特定)? 我过去成功地使用了@Resource(name="blah")和@Autowired @Qualifier("blah") 我的直觉是坚持@Resource标签,因为它已被jsr人批准。 任何人对此有强烈的想法?