C# 如何使用Unity.WebApi通过接口实例访问类属性

C# 如何使用Unity.WebApi通过接口实例访问类属性,c#,oop,asp.net-web-api,interface,inversion-of-control,C#,Oop,Asp.net Web Api,Interface,Inversion Of Control,是否可以通过IOC公开不同类中的类公共属性。我正在创建接口的实例,但无法访问类的公共属性。我正在使用Unity.WebApi解析依赖项 交易服务类 public class TransactionService : ITransactionService { private readonly IMRepository _mRepository; private readonly IFService _fGateway; public TransactionServic

是否可以通过IOC公开不同类中的类公共属性。我正在创建接口的实例,但无法访问类的公共属性。我正在使用Unity.WebApi解析依赖项

交易服务类

public class TransactionService : ITransactionService
{
    private readonly IMRepository _mRepository;
    private readonly IFService _fGateway;

     public TransactionService(IMbaRepository mbaRepository, IFpnService fpnService)
    {
        _mRepository = mRepository;
        _fGateway = fService;
    }

     private List<Transaction> SearchTransacionsByUser(FUser objFUser)
    {

         foreach (var item in something)
         {
              //can't use _fGateway to set properties because Interface 
              //  don't implement them
              _fGateway.OID = objFUser.OID.ToString();
             _fGateway.Amount = objFUser.Amount;

             _fGateway.Search(criteria);

         }

    }



}
public class FService : IFpService
{

  public string _OID { get; set; }
  public decimal _Amount{ get; set; }

  public TransactionResponse Search(string criteria)
  {

         TransactionOperationInput _input;
            _input = new TransactionOperationInput()
            {
                Criteria = _criteria,
                OID = _OID,
                Amount = _Amount
            };

           // search transactions
     }



 }

如果您控制服务,那么重构接口以公开所需的成员

public interface IFService {
   TransactionResponse Search(TransactionOperationInput input);
}
确保派生实现具有这些成员

public class FService : IFpService {

    public TransactionResponse Search(TransactionOperationInput input) { 

           // search transactions
    }
}
并且依赖类使用了正确的抽象

public class TransactionService : ITransactionService {
    private readonly IMRepository _mRepository;
    private readonly IFService fGateway;

    public TransactionService(IMbaRepository mbaRepository, IFService fService) {
        _mRepository = mRepository;
        fGateway = fService;
    }

    private List<Transaction> SearchTransacionsByUser(FUser objFUser) {    
        foreach (var item in something) {

            TransactionOperationInput input = new TransactionOperationInput() {
                Criteria = _criteria,
                OID =  objFUser.OID.ToString(),
                Amount = objFUser.Amount,
            };

             fGateway.Search(input);

            //...
         }

        //...
    }
}
公共类事务服务:ITransactionService{
私有只读IMRepository\u mRepository;
专用只读IFService fGateway;
公共事务服务(IMBARespository MBA存储库、IFService fService){
_mRepository=mRepository;
fGateway=f服务;
}
私有列表SearchTransacionsByUser(FUser objFUser){
foreach(某物中的var项){
TransactionOperationInput=新TransactionOperationInput(){
标准=_标准,
OID=objFUser.OID.ToString(),
金额=模糊器。金额,
};
fGateway.Search(输入);
//...
}
//...
}
}

最后,确保向IoC/DI容器注册适当的抽象和实现。

您是否能够更新接口以包含缺少的属性?这看起来像是一个设计问题。否则您将需要强制转换接口。然而,这是一个糟糕的设计,因为它与实现问题紧密结合,这与注入抽象的原因背道而驰。我无法控制_input=new TransactionOperationInput()b因为它是dll文件的一部分。我指的是
IFService
interface可以让IFService公开dll中TransactionOperationInput类的对象吗?我正在考虑在TransactionService类中设置TransactionOperationInput对象,我可以在其中设置所有输入,然后将其作为参数传递给FSService中的search方法。@user1263981是的,您可以这样做。这也是一个更可靠的设计。@user1263981根据您的答案检查更新的答案comment@user1263981如果你觉得答案很有用,记得也要投票支持。谢谢。搜索(TransactionOperationInput)是TransactionService中的私有方法。TransanctionService实现了两个方法,它还有一个私有方法,在类中的实现方法中调用。