Ну, я выкатил свой собственный DI.Если цель состоит в том, чтобы добиться мобильности, то, я думаю, я пришел к полуоприемлемому решению.Недостатки в том, что вы не можете по-настоящему достичь полного DI, однако в контексте моего приложения он достаточно хорош.
Интерфейс подключения:
public interface IConnection
{
public string ConnectionString;
}
Реализация конкретного соединения
public class Connection: IConnection
{
public string ConnectionString{ get; set; }
public Connection(string connectionString)
{
this.ConnectionString = connectionString;
}
public Connection():this(ConfigurtionManager.ConnectionStrings["connection"].ConnectionString)
{
//Broke DI in the interest of usability.
}
}
Интерфейс уровня доступа к данным
public interface IDataProvider
{
IConnection Connection;
public void Foo();
}
Реализация уровня доступа к конкретным данным
public class AzureProvider : IDataProvider
{
IConnection Connection { get; set; }
public AzureProvider(IConnection connection)
{
this.Connection = connection;
}
public void Foo()
{
}
}
DI Conainer / Factory (Singleton или статический класс)
public static class ProviderFactory
{
public static IDataProvider GetProvider() //I'd pass parameters if I had more than 1.
{
Connection connection = new Connection(); //this is why I broke DI.
IConnection iConnection = (IConnection)connection;
AzureProvider azureProvider = new AzureProvider(iConnection);
IDataProvider iDataProvider = (IDataProvider)azureProvider;
return iDataProvider;
}
}
Потребитель уровня доступа к данным (в данном примере это страница):
public class SomePage : Page
{
protected void Page_Load(object sender, EventArgs e)
{
IDataProvider provider = ProviderFactory.GetProvider();
provider.Foo();
}
}
Как видите, странице не нужно знать какие-либо подробности реализации уровня доступа к данным.Пока ProviderFactory может выплевывать IDataProvider, страница довольна.Поэтому, если мы решим сменить провайдера, скажем SqlStorageProvider, до тех пор, пока он реализует интерфейс IDataProvider, код страницы не нужно будет менять.Это позволяет разделить проблемы с точки зрения архитектуры программного обеспечения.