C# 在使用 IoC 解析器时如何避免传递参数

C# How to avoid passing arguments when using IoC resolver

我最近开始尝试依赖注入和 IoC。

这是一个困扰我的问题... 我有一个依赖解析器,它基本上允许我执行以下操作

injection.Register<IMyInterface, MySpecificType>();

这将自动解析类型,只要代码中的某些内容需要它并提供 MySpecificType 作为 IMyInterface 的实现。

这对 ASP.NET 中的控制器非常有用,例如,控制器构造函数没有参数,并且也由框架动态调用。

但是如果我有自己的自定义 class(在本例中为 MySpecificType)并且我想动态解析它会发生什么。也就是说,只要我的代码中的某些内容需要 IMyInterface,解析器就应该传入 MySpecificType.

这是一个例子:

injection.Register<IMyInterface, MySpecificType>();


public SomeClass(IMyInterface dependency)
{
   //do something
}

然后在我的代码中的某处我希望创建一个新实例SomeClass

var instance = new SomeClass(//What do i pass here)

我应该在构造函数中传递什么。当然我可以做类似 new MySpecificType() 的事情,但这会使我的自动依赖解析器变得毫无意义。我应该有一个单独的空构造函数并使用它还是这是不可能发生的事情。

您应该让您的 IoC 容器为您实例化您的 class。那么它真的取决于你的 IoC 容器。

例如,使用autofac

var builder = new ContainerBuilder();
builder.RegisterType<MyComponent>().As<IService>();
var container = builder.Build();

using(var scope = container.BeginLifetimeScope())
{
    var service = scope.Resolve<IService>();
}