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
}

在寻求最佳实践时,您可以通过这种方式使用服务。并使用依赖注入从控制器访问服务

  • 定义服务、域类和接口
  • 使用管理器类实现接口
  • 在startup.cs中通过依赖项注入注册服务
  • 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.