C# 服务接口良好实践
我有两个服务和一个它们实现的公共接口:C# 服务接口良好实践,c#,interface,C#,Interface,我有两个服务和一个它们实现的公共接口: interface IService{string Solve(IObject obj)} 但这两个服务的参数不同: class First: IObject{ string str {get; set;} int numb {get; set;} } class Second: IObject{ string str {get; set;} int numb {get; set;} int numb2 {get; set;} }
interface IService{string Solve(IObject obj)}
但这两个服务的参数不同:
class First: IObject{
string str {get; set;}
int numb {get; set;}
}
class Second: IObject{
string str {get; set;}
int numb {get; set;}
int numb2 {get; set;}
}
我不知道如何定义
IObject
以在第一个服务中访问str
和numb
,在第二个服务中访问str
,numb
和numb2
。IObject是一个接口,不太可能有任何内容。
首先是带有str和numb的对象。第二个是带有str、numb和numb2的对象。
将第一个(或第二个)对象定义为父对象:
class OtherObject : First
{
//you will have access to First's str and numb
}
在寻求最佳实践时,您可以通过这种方式使用服务。并使用依赖注入从控制器访问服务
services.AddTransient();
services.AddTransient();
[HttpPost]
公共异步任务DoStuff1([FromServicec]DoService1Stuff DoService1Stuff)
{
var first=新的first
{
str=“你好”,
numb=2020;
};
返回Ok(doService1Stuff.Do(第一个))
}
//你可以做同样的第二次服务。
“我需要类型同时具有两个属性和三个属性”(这基本上是当前问题所要求的)毫无意义。你肯定需要提问来澄清你想要实现的目标。你可以使用Solve(T obj)
和的约束(其中T:IObject
使IService
通用IService
,然后服务将是FirstService:IService
,你将拥有Solve(First obj)
并且您可以访问所有的属性。您能澄清一下“不可能有任何内容”是什么意思吗?
public class Service : Attribute { }
//Domain Classes
public class First{
string str {get; set;}
int numb {get; set;}
}
public class Second{
string str {get; set;}
int numb {get; set;}
int numb2 {get; set;}
}
//Services
[Service]
public class DoService1Stuff()
{
private readonly FirstManager _firstManager;
public DoService1Stuff(FirstManager firstManager)
{
_firstManager= firstManager;
}
//Implement your task
public Do(First first)
{
_firstManager.method1(first);
}
}
[Service]
public class DoService2Stuff()
{
private readonly SecondManager _secondManager;
public DoService1Stuff(SecondManager secondManager)
{
_secondManager= secondManager;
}
//Implement your task
public Do(Second second)
{
_secondManager.method1(second);
}
}
interface IFirst
{
string method1(First first);
int method2();
}
interface ISecond
{
string method1(Second second);
int method2();
int method3();
}
public class FirstManager : IFirst
{
string method1(First first)
{
//access db or business stuff
}
int method2(){}
}
public class SecondManager : ISecond
{
string method1(Second second)
{ //
}
int method2(){}
int method3(){}
}
services.AddTransient<IFirst, FirstManager>();
services.AddTransient<ISecond, SecondManager>();
[HttpPost]
public async Task<IActionResult> DoStuff1([FromServicec] DoService1Stuff doService1Stuff)
{
var first = new First
{
str="hello",
numb=2020;
};
return Ok(doService1Stuff.Do(first))
}
//You can do same for second service.