簡體   English   中英

如何為屬性分配默認值

[英]How to assign default value to a property

CustomerService是一個Web服務,正在成功調用,但是我無法在Any方法中訪問SelectCommand。 我想我在這里想念什么,有人可以建議。

public class CustomerService : Service
{
  private readonly IDbConnection _dbConnection; // injected successfully
  public ServiceCommand SelectCommand {get;set;}

  public CustomerService(IDBConnection dbConnection)
  {        
         _dbConnection = dbConnection;            
  }

  public Customer Any(CustomerRequest request)
  {
       //_dbconnection is available           

       //but selectcommand is null here   

       //db operations     

  }
}


[Route("/customers")]
public class CustomerRequest
{
    public string name { get; set; }
}

public class ServiceCommand
{
    public string SQL { get; set; }        
    public CommandType CommandType { get; set; }

    public ServiceCommand()
    {
        CommandType = CommandType.Text;
    }
}

我已經通過繼承AppHostBase初始化了連接

  public override void Configure(Container container) {
        container.Register<IDbConnectionFactory>(
          c => new OrmLiteConnectionFactory(ConfigurationManager.ConnectionStrings["default"].ConnectionString,
                                            SqlServerDialect.Provider));

        container.Register<IDbConnection>(c => c.Resolve<IDbConnectionFactory>().OpenDbConnection()).ReusedWithin(ReuseScope.Request);
      }

當我嘗試通過顯式設置SelectCommand編寫單元測試時,它可以工作。 但是我無法通過不設置值來測試它的工作方式,我假設它采用了構造函數中設置的默認值。

 var service = new CustomerService(InMemoryTestDatabase.OpenDbConnection());
 service.SelectCommand = new ServiceCommand() { SQL = "SELECT * FROM customers" };

編輯

構造函數中的IDbConnection運行正常,但是我的問題是SelectCommand,這是這里的公共屬性。 我的意圖是,如果正常調用Web服務,則可以通過在構造函數中設置以下查詢來訪問實際數據庫。

SelectCommand = new ServiceCommand() {Text = "sp_getcustomers"};

但是,當我對其進行測試時,我將其設置為sqllite數據庫,並將查詢更改為表“ select * from users”,因為sqllite不支持sp。 如前所述,單元測試可以正常工作,但是該服務無法初始化公共屬性。

如果我初始化一個與_dbConnection相同的私有只讀屬性,如下所示,它可以正常工作,但是我想顯式注入服務命令。

private readonly IDbConnection _dbConnection;
private readonly ServiceCommand _selectCommand;
public CustomerService(IDBConnection dbConnection)
{
   __dbConnection = dbConnection;
   _selectCommand = new ServiceCommand(){Text = "sp_getCustomers"};
}

請確保包括有關您問題的所有相關信息和上下文,因為如果沒有關於如何使用的過時知識就無法推斷出這一點。 例如,您的IOC是什么樣的?

您在構造函數中要求一個IDbConnection

public CustomerService(IDBConnection dbConnection)
{
     SelectCommand = new ServiceCommand();
}

但它很可能你只是注冊一個IDbConnectionFactory ,所以不存在與任何注冊依賴IDbConnection

如果從Service類繼承,則已經注入了IDbConnectionFactory並可以使用base.Db屬性訪問IDbConnection

private IDbConnection db;
public virtual IDbConnection Db
{
    get { return db ?? (db = TryResolve<IDbConnectionFactory>().Open()); }
}

所有公共財產均由國際奧委會注入

SelectCommand屬性為null的原因是因為它是一個公共屬性。 嘗試通過您的已注冊依賴項解析所有服務的公共屬性,並且由於您沒有任何ServiceCommand類型的已注冊依賴項,因此將其替換為null。 如果在構造函數中定義了它,則將拋出運行時異常,因為它只是一個屬性,已初始化為null。

如果將SelectCommand的可見性更改為protected,private,internal或static,則IOC將不會嘗試注入它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM