Jak przypisać wartość domyślną do właściwości
CustomerService jest usługą internetową i jest wywoływana pomyślnie, ale nie mogę uzyskać dostępu do SelectCommand w metodzie Any. Myślę, że coś tu brakuje, czy ktoś mógłby zasugerować.
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;
}
}
Zainicjowałem połączenie, dziedziczącAppHostBase
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);
}
Kiedy próbowałem napisać test jednostkowy, ustawiając wyraźnie SelectCommand, działa. Ale nie jestem w stanie przetestować, jak to działa, nie ustawiając wartości, założyłem, że przyjmuje domyślną wartość ustawioną w konstruktorze.
var service = new CustomerService(InMemoryTestDatabase.OpenDbConnection());
service.SelectCommand = new ServiceCommand() { SQL = "SELECT * FROM customers" };
Edytować
IDbConnection w konstruktorze działa dobrze, ale mój problem dotyczy SelectCommand, który jest tutaj własnością publiczną. Moim zamiarem jest, jeśli usługa jest wywoływana normalnie, trafiłbym do rzeczywistej bazy danych, ustawiając w konstruktorze zapytanie jak poniżej.
SelectCommand = new ServiceCommand() {Text = "sp_getcustomers"};
Ale kiedy go przetestuję, ustawię go na bazę danych sqllite i zmienię zapytanie na tabelę „select * from clients”, ponieważ sqllite nie obsługuje sp. Jak wspomniano testy jednostkowe działają dobrze, ale usługa nie jest w stanie zainicjować właściwości publicznych.
Jeśli zainicjalizuję prywatną właściwość tylko do odczytu, taką jak _dbConnection, jak poniżej, to działa dobrze, ale chciałbym jawnie wprowadzić polecenie dla usługi.
private readonly IDbConnection _dbConnection;
private readonly ServiceCommand _selectCommand;
public CustomerService(IDBConnection dbConnection)
{
__dbConnection = dbConnection;
_selectCommand = new ServiceCommand(){Text = "sp_getCustomers"};
}