Я бы решил вашу проблему с помощью репозиториев и объектов передачи данных (DTO) , например:
Некоторые общедоступные интерфейсы, которые вы сможетедля внедрения в ваш код:
public interface IFooRepository
{
FooDto GetFirst();
}
public interface IDataSetFactory
{
DataSet GetDataSet(string spName, SqlParameter[] = null);
}
Некоторый DTO для передачи данных из одного класса в другой (и только данные):
public class FooDto
{
public int CurrentCount { get; set; }
public int MaxCount { get; set; }
}
Некоторая внутренняя реализация, скрытая от глаз интерфейсаuser:
internal sealed class FooRepository : IFooRepository
{
private readonly IDataSetFactory _dsFactory;
public FooRepository(IDataSetFactory dsFactory)
{
_dsFactory = dsFactory;
}
public FooDto GetFirst()
{
return _dsFactory.GetDataSet("sp name")
.Tables[0]
.AsEnumberable()
.Select(Map)
.FirstOrDefault();
}
private FooDto Map(DataRow dr)
{
return new FooDto
{
CurrentCount = dr.Field<int>("CurrentCount"),
MaxCount = dr.Field<int>("MaxCount")
};
}
}
internal sealed class DataSetFactory : IDataSetFactory
{
public DataSetFactory() { }
private DataSet GetDataSet(string spName, SqlParameter[] = null)
{
//set up sql parameters, open connection
return ds;
}
}
И, учитывая некоторую специфическую структуру DI (Ninject, DryIoc и т. д.), вы можете внедрить эти интерфейсы в любое место кода.Огромное преимущество использования DI - оно заставляет вас правильно проектировать ваше приложение (интерфейсы отделены от реализации), поэтому в какой-то момент вы можете реализовать свой IFooRepository для чтения данных со звезд на небе или изфайл, или чтобы вернуть пустые результаты в тестировании, или все, что вы хотите, чтобы он делал.
Если вы спроектировали неправильно - он, вероятно, не будет компилироваться или будет слишком сложным.Хорошее использование DI - сложный вопрос, но, по оценкам, 99% ваших * .cs файлов НЕ будут ссылаться на ЛЮБЫЕ ссылки инфраструктуры DI:
using System.IO;
using Ninject; //<-- I mean, this one. If it is everywhere, something is overcomplexed and you are not using framework correctly.
using System.Media;