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. 我知道战略