poniedziałek, 5 grudnia 2011

Przykłady użycia StructureMap

W pierwszym poście o StructureMap napisałem, że za pomocą StructureMap możemy sobie zdefiniować jaki obiekt ma nam zostać zwrócony dla określonego interfejsu. Ale co jeśli klasa którą chcemy zwrócić w swoim konstruktorze posiada jakiś parametr np. connectionString? Otóż za pomocą StructureMap możemy również podać parametr do konstruktora. Załóżmy, że mamy klasę ResponseService dziedziczącą po interfejsie IResponseService, która w konstruktorze posiada parametr connectionString.


public interface IResponseService
{
string GetMessage();
}

public class ResponseService : IResponseService
{
public string _ConnectionString {get; private set;}

public ResponseService(string connectionString)
{
this._ConnectionString = connectionString;
}

public string GetMessage()
{
return "Hello";
}
}

Napiszmy teraz BootStraper’a, który poda określonego connectionStringa:


public class DependencyRegistry : Registry
{
public DependencyRegistry()
{
For<IResponseService>().Use<ResponseService>();
}
}

public static class BootStrapper
{
public static void Bootstrap()
{
ObjectFactory.Initialize(x => x.ForRequestedType<IResponseService>().Use<ResponseService>().WithCtorArg("connectionString").EqualTo("localHost:9800"));
}
}


W metodzie WithCtorArg podajemy nazwę parametru z konstruktora klasy ResponseService natomiast w metodzie EqualTo wpisujemy connectionString, który chcemy żeby został podany do kontruktora.

Możemy również podać connectionString, który zapisany jest w pliku app.config. Załóżmy, że napisaliśmy sobie taki oto plik app.config:








Napiszmy teraz BootStraper’a, który pobierze wartość ConnectionString z app.config i poda ją do konstruktora klasy ResponseService:

  
public static class BootStrapper
{
public static void Bootstrap()
{
ObjectFactory.Initialize(x => x.ForRequestedType<IResponseService>().Use<ResponseService>().WithCtorArg("connectionString").EqualToAppSetting("ConnectionString"));
}
}


Na stronie StructureMap można znaleźć jeden z ciekawszych przykładów zastosowania i działania StructureMap. Aby pokazać istotę tego przykładu dopiszmy do naszych klas nową:


public class MyClass
{
public IResponseService _ResponseSerive { get; private set; }

public MyClass(IResponseService responseService)
{
this._ResponseSerive = responseService;
}
}

Wszystkie inne klasy, które napisaliśmy wcześniej pozostają bez zmian. Teraz spróbujmy wywołać instancję klasy MyClass za pomocą ObjectFactory:

var obj = ObjectFactory.GetInstance<MyClass>();


Oto jak wygląda nasz obiekt obj:



Jak widać z przedstawionego przykładu, wystarczy, że w BootStrapper’e zadeklarujemy że do interfejsu IResposeService jest przyporządkowany obiekt ResponseService i jeśli spróbujemy za pomocą ObjectFactory uzyskać instancję obiektu (w naszym przypadku MyClass), który w konstruktorze jako parametr pobiera obiekt interfejsu IResponseService, StructureMap sam poda odpowiedni obiekt do konstruktora.

0 komentarze:

Prześlij komentarz

 
Design by Free WordPress Themes | Bloggerized by Lasantha - Premium Blogger Themes | Online Project management