Внедрение зависимостей с помощью Simple Injector .NET тип или пространство имен не удалось найти - PullRequest
0 голосов
/ 16 января 2019

Это мой код в файле global.asax. Кроме того, у меня есть 4 библиотечных класса в этом решении и в другом файле проекта. Два из них имеют один класс для интерфейса IMainService, а другой - реализацию интерфейса с именем MainImplementation.

protected void Application_Start()
    {
        var container = new Container();
        container.Register<IMainService, MainImplementation>(Lifestyle.Singleton);
        container.RegisterWebApiControllers(GlobalConfiguration.Configuration);
        GlobalConfiguration.Configuration.DependencyResolver = new SimpleInjectorWebApiDependencyResolver(container);
        GlobalConfiguration.Configuration.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
        container.Verify();


        GlobalConfiguration.Configure(WebApiConfig.Register);
    }

Моя проблема в том, что в линии container.Register<IMainService, MainImplementation>(Lifestyle.Singleton); IMainService, MainImplementation подчеркнут красным и не распознает их, говоря, что тип или пространство имен не могут быть найдены. Я пропускаю директиву using или ссылку на сборку? Когда я иду, чтобы добавить ссылки для IMainService, MainImplementation в этом проекте, я получаю сообщение о том, что это вызовет циклическую зависимость.

1 Ответ

0 голосов
/ 16 января 2019

Вы должны создать класс, подобный IocManager. Например:

public class IocManager : IIocManager
{
   public IocManager()
   {
      IocContainer = new Container();
   }
   //other methods
}

После создания обычного класса регистратора:

public class ConventionalRegistrar
{
        public static void RegisterAssembly(Assembly assembly)
        {
            var container = IocManager.Instance.IocContainer;

            // All services register in assembly
            container.Register(
            Classes.FromAssembly(assembly)
            .Pick().If(t => t.Name.EndsWith("Service"))
            .Configure(configurer => configurer.Named(configurer.Implementation.Name))
            .WithService.Self()
            .WithServiceDefaultInterfaces()
            .LifestylePerWebRequest()
            );

        //other registers
        }
}

Так что вы можете использовать в других любых областях:

protected void Application_Start()
{
      BasicConventionalRegistrar.RegisterAssembly(typeof(MvcApplication).Assembly);
      BasicConventionalRegistrar.RegisterGlobalFilters();
}
...