Bu, aparat kullanarak ünite sınama kodunu denerken sorunlara benzer. o yuvarlak
bir yolu üzerinde ExecuteReader
yöntemi ile bir arabirim uygulama bir nesne ile kod SqlCommand
kullanımını değiştirmektir. Daha sonra nesneyi daha kolay bir şekilde değiştirebilirsiniz, belki bir fabrika modeli kullanarak.
Yani bunun gibi bir kod yerini alacak:
using (SqlCommand command = new SqlCommand(query))
{
command.ExecuteReader();
}
ile:
public interface ISqlCommand
{
SqlDataReader ExecuteReader();
// further interface methods here...
}
Sonra oluşturmak:
var sqlCommandFactory = new SqlCommandFactory();
using (ISqlCommand command = sqlCommandFactory.CreateSqlCommand(query))
{
command.ExecuteReader();
}
Öncelikle yerine istediğiniz yöntemleri içeren arabirimi tanımlayan SqlCommand
yapıcısı ile aynı imzayı kullanan bir fabrika:
internal class SqlCommandFactory
{
bool _useMyClass = true;
public ISqlCommand CreateSqlCommand(string query)
{
if (_useMyClass)
{
return new MySqlCommand(query);
}
else
{
return new SqlCommandWrapper(query);
}
}
}
Ardından MySqlCommand
sınıfta yedek kod yazmak: .NET SqlCommand
sınıf Açıkçası yeni ISqlCommand
arabirimini uygulamıyor gibi
public MySqlCommand : ISqlCommand
{
public SqlDataReader ExecuteReader()
{
// your new code here
}
}
, bunu yapan bir sarmalayıcı sınıf oluşturmak:
public SqlCommandWrapper : ISqlCommand
{
SqlCommand _sqlCommand;
public SqlCommandWrapper(string query)
{
_sqlCommand = new SqlCommand(query);
}
public SqlDataReader ExecuteReader()
{
_sqlCommand.ExecuteReader();
}
}
biraz ekstra çalışma, ancak bu yöntemin faydaları için uygulanmasını değişebileceğini ne olursa olsun sizi w ünite testi dahil olmak üzere karınca (bir sahte fabrikada kodunuza geçerek).
ekstra çalışma bir defalık olmalı ve istendiği gibi isim ve orijinal bir yöntem imzası korur olmalıdır. Bu kod siz (veya takım) bu tanınmış desen alışmakta kez özellikle (özel/uzatma yöntemlerine kıyasla) anlamak için daha tanıdık ve daha kolay görünmesi gerekir.
bana kötü bir fikir gibi geliyor. – lahsrah
O zaman bunun bir aşırı yük gibi görünmesi için bazı ekstra opsiyonel parametrelerle bir uzantısı yöntemi olabilir mi? Özür dilerim, cevap vermek yerine soru soruyorum. – shahkalpesh
Muhtemelen profil api ya da gerçekten hacky ile bir şey. Burada birkaç yıl önce burada bir tane var http://www.codeproject.com/Articles/37549/CLR-Injection-Runtime-Method-Replacer buts gerçekten hacky – AbdElRaheim