Tag: dependency injection

从静态工厂类访问ASP.NET Core DI容器

我创建了一个ASP.NET核心MVC / WebApi站点,该站点有一个RabbitMQ订阅者,基于James Still的博客文章Real-World PubSub Messaging with RabbitMQ 。 在他的文章中,他使用静态类来启动队列订阅者并为排队事件定义事件处理程序。 然后,此静态方法通过静态工厂类实例化事件处理程序类。 using RabbitMQ.Client; using RabbitMQ.Client.Events; using System; using System.Text; namespace NST.Web.MessageProcessing { public static class MessageListener { private static IConnection _connection; private static IModel _channel; public static void Start(string hostName, string userName, string password, int port) { var factory = new ConnectionFactory { HostName = […]

重构静态类以使用dependency injection

我们需要在具有静态方法的代码中使用非托管库。 我想在我的代码中将库操作作为依赖项引入。 除了具有静态方法之外,库还具有初始化方法和设置方法,两者都是全局的。 因此,我不能将它包装在实例类中,因为如果一个实例更改了设置,则所有其他实例都将受到影响,如果一个实例初始化,则所有其他实例将重新初始化。 我想把它作为一个单独的类引入。 这样它将在一个实例类中,但只有一个实例,因此我不必担心更改设置或初始化。 您如何看待这种方法? 我对dependency injection模式很新,我不确定单例模式是否是一个好的解决方案? 您对类似案例的解决方案是什么? 编辑:初始化也是一个参数,所以我不能只是锁定方法调用,并在每次调用时重新初始化和更改设置。 编辑2:以下是一些方法的签名: public static void Initialize(int someParameter) // Parameter can only be changed by re-initalization which // will reset all the settings back to their default values. public static float[] Method1(int someNumber, float[] someArray) public static void ChangeSetting(string settingName, int settingValue)

Simple Injector:在同一个图的服务中注入相同的UnitOfWork实例

我有多个服务,每个服务都使用Simple Injector IoC容器将UnitOfWork注入到构造函数中。 目前我可以看到每个UnitOfWork实例都是一个单独的对象,这很糟糕,因为我使用的是Entity Framework,并且需要在所有工作单元中使用相同的上下文引用。 如何确保每个解析请求将相同的UnitOfWork实例注入到所有服务中? 命令完成后,我的UnitOfWor将由外部命令处理程序装饰器保存。 请注意,这是一个通用库,将用于MVC和Windows Forms,如果可能的话,为两个平台提供通用解决方案会很不错。 代码如下: // snippet of code that registers types void RegisterTypes() { // register general unit of work class for use by majority of service layers container.Register(); // provide a factory for singleton classes to create their own units of work // at will container.RegisterSingle(); // register […]

autofac的Func 来解析命名服务

鉴于注册服务: builder.RegisterType().Named(“one”).As(); builder.RegisterType().Named(“two”).As(); builder.RegisterType().Named(“three”).As(); 我可以通过注入类似Func东西来检索IFoo接口的命名实现吗? public class SomeClass(Func foo) { var f = foo(“one”); Debug.Assert(f is Foo1); var g = foo(“two”); Debug.Assert(g is Foo2); var h = foo(“three”); Debug.Assert(h is Foo3); } 我知道我可以用Meta做,但我不想用它。

如何在基本的MVC5.1网站中正确注册AutoFac?

AutoFac最近已针对MVC 5.1进行了更新,但在撰写本文时,我发现缺少文档(特别是对于一个简单的示例)。 我想将依赖项注入MVC​​控制器并注册我自己的实现,例如电子邮件(实际发送与打印到输出窗口)作为基本示例。 我不知道我是否遗漏了一个很好的资源,我有点担心,因为它使用OWIN规范,实现可能与MVC5.1不同(ASP.NET身份使用OWIN并且使用了一些特殊属性正确实例化OWIN)所以需要检查我是否正确。 我有一个使用以下设置代码的工作示例 – 对于标准MVC5.1 Web应用程序,这是正确和良好的做法吗? 额外问题:我是否需要将InstancePerHttpRequest添加到RegisterControllers行? 即builder.RegisterControllers(typeof(MvcApplication).Assembly).InstancePerHttpRequest(); (注意:我在Autofac上看到GitHub上的示例,但找不到适合MVC5.1的简单示例。) public static void RegisterDependencies() { // Register MVC-related dependencies var builder = new ContainerBuilder(); builder.RegisterControllers(typeof(MvcApplication).Assembly); builder.RegisterModelBinders(typeof(MvcApplication).Assembly); builder.RegisterModule(); // Register e-mail service builder.RegisterType().As().InstancePerHttpRequest(); builder.RegisterModelBinderProvider(); // Set the MVC dependency resolver to use Autofac var container = builder.Build(); DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); } 而我的控制器: public class HomeController : […]

将DI容器使用保留在Silverlight和MVVM中的组合根目录中

我不太清楚我是如何设计的,所以我在Silverlight + MVVM应用程序的组合根目录中保留对DI容器的引用。 我有以下简单的使用场景:有一个主视图(可能是一个项目列表)和一个打开一个项目的编辑视图的操作。 因此,主视图必须在用户执行操作时创建并显示编辑视图(例如,单击某个按钮)。 为此,我有以下代码: public interface IView { IViewModel ViewModel {get; set;} } 然后,对于我需要能够创建的每个视图,我都有一个抽象工厂,就像这样 public interface ISomeViewFactory { IView CreateView(); } 然后将此工厂声明为“父”视图模型的依赖项,如下所示: public class SomeParentViewModel { public SomeParentViewModel(ISomeViewFactory viewFactory) { // store it } private void OnSomeUserAction() { IView view = viewFactory.CreateView(); dialogService.ShowDialog(view); } } 所以一切都很好,直到这里,没有DI容器在视线:)。 现在来了ISomeViewFactory的实现: public class SomeViewFactory : ISomeViewFactory { […]

Autofac – 注册多个装饰器

鉴于以下内容: public interface ICommandHandler { void Handle(TCommand command); } public class MoveCustomerCommand { } public class MoveCustomerCommandHandler : ICommandHandler { public void Handle(MoveCustomerCommand command) { Console.WriteLine(“MoveCustomerCommandHandler”); } } public class TransactionCommandHandlerDecorator : ICommandHandler { private readonly ICommandHandler _decorated; public TransactionCommandHandlerDecorator(ICommandHandler decorated) { _decorated = decorated; } public void Handle(TCommand command) { Console.WriteLine(“TransactionCommandHandlerDecorator – before”); _decorated.Handle(command); […]

使用dependency injection注入多个实现

我目前正在开发ASP.NET核心项目,并希望使用内置的dependency injection(DI)function。 好吧,我从界面开始: ICar { string Drive(); } 并希望多次实现ICar界面 public class BMW : ICar { public string Drive(){…}; } public class Jaguar : ICar { public string Drive(){…}; } 并在Startup类中添加以下内容 public void ConfigureServices(IServiceCollection services) { // Add framework services. services.AddMvc(); services.AddTransient(); // or services.AddTransient(); } 现在我必须在两个实现之间做出决定,我决定的类将在每个需要ICar实现的构造函数中设置。 但我的想法是,如果请求的控制器是BMWController,那么如果请求JaguarController,则使用BMW实现或使用Jaguar 。 DI对我来说没有意义。 我该如何正确处理这个问题? 为了更好地理解我的问题,请查看此图片: https : //media-www-asp.azureedge.net/media/44907/dependency-injection-golf.png ?raw […]

UnityContainer.Resolve或ServiceLocator.GetInstance?

这似乎是一个愚蠢的问题,因为在我的代码中一切正常,但我用我的Unity容器_ambientContainer以这种方式注册了单例: _ambientContainer.RegisterType(new ContainerControlledLifetimeManager()); 为了避免使用我的本地字段,我使用: get { return ServiceLocator.Current.GetInstance(); } 在我的get属性中获取我的对象的实例。 这样我总是得到相同的实例( Application.StateContext仍然是单例)或者GetInstance创建了一个新实例? 是否更好地使用本地_ambientContainer字段? get { return _ambientContainer.Resolve(); } 谢谢。

EF6 Code First具有通用存储库和dependency injection和SoC

经过大量阅读并尝试使用Entity Framework最新稳定版(6.1.1)。 我正在阅读很多关于是否一般使用DbContext或EF存储库的矛盾,因为它的DbContext已经提供了一个存储库并且DbSet UoW ,开箱即用。 让我首先解释一下我的解决方案在项目方面所包含的内容,然后我将回到这个矛盾中。 它有一个类库项目和一个asp.net-mvc项目。 类lib项目是数据访问,并且为Code First启用了Migrations 。 在我的类lib项目中,我有一个通用的存储库: public interface IRepository where TEntity : class { IEnumerable Get(); TEntity GetByID(object id); void Insert(TEntity entity); void Delete(object id); void Update(TEntity entityToUpdate); } 以下是它的实现: public class Repository where TEntity : class { internal ApplicationDbContext context; internal DbSet dbSet; public Repository(ApplicationDbContext context) { this.context = […]