Инъекция в контроллере web api без использования Single Instance - PullRequest
1 голос
/ 27 июня 2019

У меня есть служба, которая зарегистрирована в моем контейнере как один экземпляр

public class MyModule : Module
{
    protected override void Load(ContainerBuilder builder)
    {
        builder.RegisterType<MyService>()
            .As<IMyService>()
            .SingleInstance();

    }
}

Контейнер создается как показано ниже

 public static IContainer SetupContainer()
 {
     var builder = new ContainerBuilder();
     var moduleTypes = TypeCache.GetTypes(x => x.IsClassEx() && !x.IsAbstractEx() && x.ImplementsInterfaceEx<IModule>());

     foreach (var moduleType in moduleTypes)
     {
        if (Activator.CreateInstance(moduleType) is IModule module)
           builder.RegisterModule(module);
     }

     var assemblies = AppDomain.CurrentDomain.GetAssemblies();
     builder.RegisterAssemblyModules(assemblies);

     var result = builder.Build();
     return result;
  }

Все это прекрасно работает в обычном коде - яможет внедрить мой сервис и его разрешение разрешено, как я ожидаю

Однако, когда я пытаюсь внедрить свой сервис в контроллер веб-API, служба снова разрешается, но Autofac дает мне НОВЫЙ экземпляр моего сервиса

Как я могу предотвратить такое поведение, чтобы внедрить первоначально созданный экземпляр?

1 Ответ

0 голосов
/ 24 июля 2019

Я думаю, что вам здесь не хватает того, что вы на самом деле не решаете свой контейнер в нужном месте, и поэтому в зависимости от того, какой тип интеграции вы используете, вы можете выполнить одно из следующих действий.

//For OWIN you could do something like the following.
public class Startup
{
  public void Configuration(IAppBuilder app)
  {
    var container = YourObject.SetupContainer();

    // Register the Autofac middleware FIRST. This also adds
    // Autofac-injected middleware registered with the container.
    app.UseAutofacMiddleware(container);

    // ...then register your other middleware not registered
    // with Autofac.
  }
}

//In your Global.asax.cs 

    protected void Application_Start() 
    {

       var container = YourObject.SetupContainer();
       DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

    }

Пример MVC Реализация OWIN

...