Witam
Tworzę mini projekcik WCF hostowany przez IIS.
Chciałbym zaimplementować DI w oparciu o SimpleInjector.
Do tej pory używałem Castle Windsor. Po prostu posiadałem działający przykład konfiguracji i zawsze go stosowałem nie zgłębiając się dlaczego i jak to działa.
Teraz mam problem aby poprawnie skonfigurować/zastosować SimpleInjector.
Na razie żeby sprawdzić czy sobie z tym radzę stworzyłem mikroprojekt WCF do którego próbuję zaimplementować SimpleInjector.
Zainstalowałem pakiet SimpleInjector.Integration.Wcf.QuickStart.
Service contract:
namespace SimpleInjectorTest2
{
// UWAGA: możesz użyć polecenia „Zmień nazwę” w menu „Refaktoryzuj”, aby zmienić nazwę interfejsu „IService1” w kodzie i pliku konfiguracji.
[ServiceContract]
public interface IDzialanie
{
[OperationContract]
int Wynik(int value1, int value2);
}
}
Klasa implementująca service contract (tutaj w konstruktor chciałbym wstrzyknąć klasę, która implementuje interfejs ISuma):
namespace SimpleInjectorTest2
{
public class Dzialanie : IDzialanie
{
private ISuma suma;
public Dzialanie(ISuma suma)
{
this.suma = suma;
}
public int Wynik(int value1, int value2)
{
return suma.Suma(value1, value2);
}
}
}
Klasa wygenerowana w App_Start po zainstalowaniu pakietu SimpleInjector.Integration.Wcf.QuickStar:
[assembly: WebActivator.PostApplicationStartMethod(typeof(SimpleInjectorTest2.App_Start.SimpleInjectorInitializer), "Initialize")]
namespace SimpleInjectorTest2.App_Start
{
using System.Reflection;
using SimpleInjector;
using SimpleInjector.Integration.Wcf;
public static class SimpleInjectorInitializer
{
/// <summary>Initialize the container and register it for the WCF ServiceHostFactory.</summary>
public static void Initialize()
{
var container = new Container();
container.Options.DefaultScopedLifestyle = new WcfOperationLifestyle();
InitializeContainer(container);
container.RegisterWcfServices(Assembly.GetExecutingAssembly());
container.Verify();
SimpleInjectorServiceHostFactory.SetContainer(container);
// TODO: Add the following attribute to all .svc files:
// Factory="SimpleInjector.Integration.Wcf.SimpleInjectorServiceHostFactory, SimpleInjector.Integration.Wcf"
}
private static void InitializeContainer(Container container)
{
container.Register<IDzialanie, Dzialanie>();
container.Register<ISuma, Suma>(Lifestyle.Singleton);
// For instance:
// container.Register<IUserRepository, SqlUserRepository>(Lifestyle.Scoped);
}
}
}
No i niestety to nie działa. Ktoś może mnie pokierować jak to poprawnie skonfigurować aby wstrzyknąć zależność w konstruktorze?
W wygenerowanym pliku jest jeszcze poniższy komentarz. Tylko nie bardzo wiem jak to dodać i gdzie?
// TODO: Add the following attribute to all .svc files:
// Factory="SimpleInjector.Integration.Wcf.SimpleInjectorServiceHostFactory, SimpleInjector.Integration.Wcf"