【问题标题】:How to access class properties through an Interface instance using Unity.WebApi如何使用 Unity.WebApi 通过接口实例访问类属性
【发布时间】:2019-04-17 18:56:50
【问题描述】:

是否可以通过 IOC 暴露不同类中的类公共属性。我正在创建一个接口实例,但我无法访问类的公共属性。我正在使用 Unity.WebApi 来解决依赖关系。

TransactionService 类

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);

         }

    }



}

FService 类

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
     }



 }

【问题讨论】:

  • 您能否更新界面以包含缺失的属性?这看起来像是一个设计问题。
  • 否则需要强制转换接口。然而,这是一个糟糕的设计,因为它与实现问题紧密耦合,这与注入抽象的原因背道而驰。..
  • 我对 _input = new TransactionOperationInput() 没有任何控制权,因为它是 dll 文件的一部分。
  • 我指的是IFService接口

标签: c# oop asp.net-web-api interface inversion-of-control


【解决方案1】:

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

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);

            //...
         }

        //...
    }
}

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

【讨论】:

  • IFService 能否公开一个在 dll 中的 TransactionOperationInput 类的对象?我正在考虑在 TransactionService 类中使用 TransactionOperationInput 对象,我可以在其中设置所有输入,然后将其作为参数传递给 Fservice 中的搜索方法。
  • @user1263981 是的,您可以这样做。这也是一个更可靠的设计。
  • @user1263981 根据您的评论检查更新的答案
  • @user1263981 如果您发现有用的答案,请记得投票。
  • 谢谢。 Search(TransactionOperationInput input) 是 TransactionService 中的私有方法。 TransanctionService 实现了两种方法,它还有一个私有方法,在类中的实现方法中被调用。
猜你喜欢
  • 2014-06-11
  • 2021-11-07
  • 2013-06-07
  • 2021-05-27
  • 1970-01-01
  • 2020-07-24
  • 1970-01-01
  • 1970-01-01
  • 2012-03-11
相关资源
最近更新 更多