[英]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.