Как я могу использовать внедрение зависимостей без изменения / добавления конструкторов - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть следующий код asp.net c #

{      
    public class Test
    {

    ISomeService _someService;

    public Test()
    {
    }

    public void DoSomething()
    {
    _someService.Do();
    }
}

Мне нужно предоставить ISomeService для класса Test, и я не знаю, как это сделать.Мне не разрешено добавлять дополнительную конструкцию, которая устраняла бы всю проблему, например

public Test(ISomeService someService)
{
    _someService = someService;
}

Я пытался использовать сеттерную инъекцию или методную инъекцию, но это не помогло.

Реализация ISomeService в классе SomeService также использует инъекцию конструктора, например

public SomeService(IService1 service1, Iservice2 service2)

Не уверен, что здесь делать.

ЗДЕСЬ ПОЛНЫЙ КОД

 public class Startup
    {
        private IService _service;

        public Startup()
        {

        }

        public Startup(IService service)
        {
            _service = service;
        }


        public void Configuration(IAppBuilder app)
        {
            HttpConfiguration config = new HttpConfiguration();

            var container = new UnityContainer();            
            container.RegisterType<IService, Service>();
            config.DependencyResolver = new UnityDependencyResolver(container);

            app.UseWebApi(config);

            _service.DoSomething());

        }
    }

_сервис нулевой

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

То, что я в итоге сделал, это

var serviceCollection = new ServiceCollection();

serviceCollection.AddTransient<IService, Service>();

// create service provider
var serviceProvider = serviceCollection.BuildServiceProvider();

_service = ActivatorUtilities.CreateInstance<Service>(serviceProvider);

_service.DoSomething();

Благодаря этому ответу Внедрение зависимостей с классами, отличными от класса Controller

0 голосов
/ 12 февраля 2019

Я бы предложил вам использовать фабрику для создания вашего объекта.Это будет иметь экземпляр ISomeService, внедренный в конструктор.

Затем в методе CreateTest () на вашей фабрике установите свойство ISomeService напрямую.

public class Factory
{
    private readonly ISomeService someService;

    public Factory(ISomeService someService)
    {
        this.someService = someService ?? throw new ArgumentNullException(nameof(someService));
    }
    public TestClass CreateTestClass()
    {
        var instance = new TestClass();
        instance.SomeService = this.someService;
        return instance;
    }

}

Вы должны заметить, что большинство провайдеров DIвстроенный функционал, позволяющий использовать семантику фабрики без необходимости создавать собственные фабрики.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...