簡體   English   中英

如何在不更改/添加構造函數的情況下使用依賴項注入

[英]How can I use dependency injection without changing/adding constructors

我有以下asp.net C#代碼

{      
    public class Test
    {

    ISomeService _someService;

    public Test()
    {
    }

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

我需要向Test類提供ISomeService,但我不知道該怎么做。 例如,我不允許添加其他構造,這會使整個問題消失

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

我嘗試使用setter注入或方法注入,但是沒有成功。

SomeService類中ISomeService的實現也使用構造函數注入,例如

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());

        }
    }

_service為空

我建議您使用工廠創建對象。 那將在構造函數上注入一個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提供程序都內置了允許工廠語義的功能,而無需創建自己的工廠。

我最終要做的是這個

var serviceCollection = new ServiceCollection();

serviceCollection.AddTransient<IService, Service>();

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

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

_service.DoSomething();

感謝這個答案依賴注入與控制器類以外的其他類

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM