C# NET内核中的依赖注入

C# NET内核中的依赖注入,c#,.net-core,dependency-injection,interface,C#,.net Core,Dependency Injection,Interface,我试图在控制器中创建一个类的实例。但是,我做不到 控制器代码: [HttpPost] [Route("connection")] public async Task<IActionResult> DoSomething(string firstName, string lastName) { return new OkObjectResult(new MyClass().ShowData(firstName, las

我试图在控制器中创建一个类的实例。但是,我做不到

控制器代码:

    [HttpPost]
    [Route("connection")]
    public async Task<IActionResult> DoSomething(string firstName, string lastName)
    {
        return new OkObjectResult(new MyClass().ShowData(firstName, lastName));
    }

如何将
接口
注入控制器?还有,我如何解耦ClassOne和ClassII的实例?我想注册IClassOneTwo接口,根据IF/ELSE条件,我想获得ClassOne或ClassTwo的实例。

为了完整性起见,您应该在接口后面抽象
MyClass

例如:

公共接口IMyClass
{
任务ShowData(stringfirstname、stringlastname);
}
并让
MyClass
实现它:

公共类MyClass:IMyClass
{
专用只读接口_someInterface;
公共MyClass(接口someInterface)
{
_someInterface=someInterface;
}
公共任务ShowData(stringfirstname、stringlastname)
{
//一些逻辑
返回Task.FromResult(true);
}
}
然后在
Startup.cs
类中,在
ConfigureServices
方法中,您应该注册它:

services.AddTransient<IMyClass, MyClass>();
然后,在控制器中,应通过构造函数注入所需的服务:

公共密封类MyController:ControllerBase
私有只读IMyClass\u myClass;
公共MyController(IMyClass myClass)
{
_myClass=myClass;
}
[HttpPost,路由(“连接”)]
公共异步任务DoSomething(
[FromQuery]字符串名,[FromQuery]字符串名)
{
返回Ok(等待_myClass.ShowData(firstName,lastName));
}
}
编辑以添加。。。 OP询问如何使
MyClass
或多或少成为一个可以使用
接口执行操作的实用程序。因此,您仍然希望将
接口
注册到管道:

services.AddTransient<ISomeInterface, SomeOtherClass>();
已编辑以添加(再次)。。。 所以我想我们已经弄清OP想要什么了。他们希望注入共享同一接口的两个服务。有很多方法可以做到这一点。我会坚持用我过去用过的

首先,定义一个委托:

public delegate IClassOneTwo MyServiceResolver(string key);
然后在
Startup.cs
中的
ConfigureServices
方法中,注册:

services.AddTransient<ClassOne>();
services.AddTransient<ClassTwo>();

现在,您的服务将在运行时解析。

为了完整性起见,您应该在接口后面抽象
MyClass

例如:

公共接口IMyClass
{
任务ShowData(stringfirstname、stringlastname);
}
并让
MyClass
实现它:

公共类MyClass:IMyClass
{
专用只读接口_someInterface;
公共MyClass(接口someInterface)
{
_someInterface=someInterface;
}
公共任务ShowData(stringfirstname、stringlastname)
{
//一些逻辑
返回Task.FromResult(true);
}
}
然后在
Startup.cs
类中,在
ConfigureServices
方法中,您应该注册它:

services.AddTransient<IMyClass, MyClass>();
然后,在控制器中,应通过构造函数注入所需的服务:

公共密封类MyController:ControllerBase
私有只读IMyClass\u myClass;
公共MyController(IMyClass myClass)
{
_myClass=myClass;
}
[HttpPost,路由(“连接”)]
公共异步任务DoSomething(
[FromQuery]字符串名,[FromQuery]字符串名)
{
返回Ok(等待_myClass.ShowData(firstName,lastName));
}
}
编辑以添加。。。 OP询问如何使
MyClass
或多或少成为一个可以使用
接口执行操作的实用程序。因此,您仍然希望将
接口
注册到管道:

services.AddTransient<ISomeInterface, SomeOtherClass>();
已编辑以添加(再次)。。。 所以我想我们已经弄清OP想要什么了。他们希望注入共享同一接口的两个服务。有很多方法可以做到这一点。我会坚持用我过去用过的

首先,定义一个委托:

public delegate IClassOneTwo MyServiceResolver(string key);
然后在
Startup.cs
中的
ConfigureServices
方法中,注册:

services.AddTransient<ClassOne>();
services.AddTransient<ClassTwo>();

现在,您的服务将在运行时解析。

为了清楚起见,他们只需要注入someinterface,然后就可以在构造函数中将其传递给myclass。然而,正如您在代码中所做的那样,最有可能期望的行为是同时被注入hank you@Andy。我对IMyClass有问题。我有一个从IMyClass继承的两个类,即ClassOne和ClassII。基于名称条件参数“firstName”,我需要创建ClassOne或ClassTwo的实例。我怎么做呢?你不需要通过接口,你只需要注入ClassOne和ClassTwo,你的意思是。我应该直接创建ClassOne或ClassTwo的实例?@KiddoDeveloper——你怎么知道你需要哪一个?逻辑是什么?我将更新我的答案以反映这一点。为了清楚起见,他们只需要注入someinterface,然后就可以在构造函数中将其传递给myclass。然而,正如您在代码中所做的那样,最有可能期望的行为是同时被注入hank you@Andy。我对IMyClass有问题。我有一个从IMyClass继承的两个类,即ClassOne和ClassII。基于名称条件参数“firstName”,我需要创建ClassOne或ClassTwo的实例。我怎么做呢?你不需要通过接口,你只需要注入ClassOne和ClassTwo,你的意思是。我应该直接创建ClassOne或ClassTwo的实例?@KiddoDeveloper——你怎么知道你需要哪一个?逻辑是什么?我将更新我的答案以反映这一点。更新了问题。它仍然不清楚<代码>如何将接口插入控制器?
答案如下<代码>如何将一类和二类的实例解耦?
我不知道这意味着什么。这似乎是一个问题。@KiddoDeveloper我建议您仔细阅读一下策略pattern@Nkosi. 我知道战略