使用.NET Core的DI容器实例化对象

时间:2016-10-30 22:34:12

标签: c# dependency-injection .net-core

我正在使用IServiceCollection为我的对象创建所需服务的列表。现在我想实例化一个对象并让DI容器解析该对象的依赖关系

示例

// In my services config.
services
    .AddTransient<IMyService, MyServiceImpl>();

// the object I want to create.
class SomeObject
{
    public SomeObject(IMyService service)
    {
        ...
    }
}

如何让DI容器创建SomeObject类型的对象,并注入dependecies? (可能这是它对控制器的作用?)

注意:我不想将SomeObject存储在服务集合中,我只是希望能够做到这样的事情......

SomeObject obj = startup.ServiceProvider.Resolve<SomeObject>();

...基本原理:我没有必要将所有控制器添加到服务容器中,所以我不明白为什么我要向它添加SomeObject

3 个答案:

答案 0 :(得分:6)

如标记答案的注释中所述,您可以使用ActivatorUtilities.CreateInstance方法。 .net Core中已经存在此功能(我认为自1.0版以来)。

请参阅:https://docs.microsoft.com/en-us/dotnet/api/microsoft.extensions.dependencyinjection.activatorutilities.createinstance

答案 1 :(得分:2)

这有点粗糙,但这有效

Carthage bootstrap --platform iOS --no-use-binaries --toolchain com.apple.dt.toolchain.Swift_3_0

答案 2 :(得分:0)

扩展方法:

public static class Extensions
{
    public static T BuildObject<T>(this IServiceProvider serviceProvider, params object[] parameters)
        => ActivatorUtilities.CreateInstance<T>(serviceProvider, parameters);
}

用法:

[HttpGet]
public IEnumerable<WeatherForecast> Get()
{
    var ss = HttpContext.RequestServices.BuildObject<SomeService>();
}