Dependency Injection Grundlagen - Malte...
Transcript of Dependency Injection Grundlagen - Malte...
![Page 1: Dependency Injection Grundlagen - Malte Clasenmalteclasen.de/blog/wp-content/uploads/2013/09/Dependency_Inject… · Test: Logs invalid Get [TestMethod] public void LogsInvalidGet()](https://reader034.fdocuments.in/reader034/viewer/2022050414/5f8b1cadc48b130e186f5be5/html5/thumbnails/1.jpg)
Malte Clasen
Dependency Injection Grundlagen
![Page 2: Dependency Injection Grundlagen - Malte Clasenmalteclasen.de/blog/wp-content/uploads/2013/09/Dependency_Inject… · Test: Logs invalid Get [TestMethod] public void LogsInvalidGet()](https://reader034.fdocuments.in/reader034/viewer/2022050414/5f8b1cadc48b130e186f5be5/html5/thumbnails/2.jpg)
Anwendung: Rezept-DB
![Page 3: Dependency Injection Grundlagen - Malte Clasenmalteclasen.de/blog/wp-content/uploads/2013/09/Dependency_Inject… · Test: Logs invalid Get [TestMethod] public void LogsInvalidGet()](https://reader034.fdocuments.in/reader034/viewer/2022050414/5f8b1cadc48b130e186f5be5/html5/thumbnails/3.jpg)
Repository Interface
public interface IRecipeRepository
{
Recipe Get(Guid id);
void Put(Recipe recipe);
long Count { get; }
}
![Page 4: Dependency Injection Grundlagen - Malte Clasenmalteclasen.de/blog/wp-content/uploads/2013/09/Dependency_Inject… · Test: Logs invalid Get [TestMethod] public void LogsInvalidGet()](https://reader034.fdocuments.in/reader034/viewer/2022050414/5f8b1cadc48b130e186f5be5/html5/thumbnails/4.jpg)
Test: Throws on invalid Get
[TestMethod]
public void ThrowsOnInvalidGet()
{
var repository = new RecipeRepositoryUsingNew();
repository.Invoking(r => r.Get(Guid.NewGuid())) .ShouldThrow<ArgumentException>();
}
![Page 5: Dependency Injection Grundlagen - Malte Clasenmalteclasen.de/blog/wp-content/uploads/2013/09/Dependency_Inject… · Test: Logs invalid Get [TestMethod] public void LogsInvalidGet()](https://reader034.fdocuments.in/reader034/viewer/2022050414/5f8b1cadc48b130e186f5be5/html5/thumbnails/5.jpg)
Test: Logs invalid Get
[TestMethod]
public void LogsInvalidGet()
{
var repository = new RecipeRepositoryUsingNew();
repository.Invoking(r=>r.Get(Guid.NewGuid()))
.ShouldThrow<ArgumentException>();
repository.Log.Get().Should().HaveCount(1);
}
![Page 6: Dependency Injection Grundlagen - Malte Clasenmalteclasen.de/blog/wp-content/uploads/2013/09/Dependency_Inject… · Test: Logs invalid Get [TestMethod] public void LogsInvalidGet()](https://reader034.fdocuments.in/reader034/viewer/2022050414/5f8b1cadc48b130e186f5be5/html5/thumbnails/6.jpg)
Logging
public Recipe Get(Guid id)
{
Recipe result;
if (!_recipes.TryGetValue(id, out result))
{
Log.Error(Clock.Now, "id not found");
throw new ArgumentException("id not found");
}
return result;
}
![Page 7: Dependency Injection Grundlagen - Malte Clasenmalteclasen.de/blog/wp-content/uploads/2013/09/Dependency_Inject… · Test: Logs invalid Get [TestMethod] public void LogsInvalidGet()](https://reader034.fdocuments.in/reader034/viewer/2022050414/5f8b1cadc48b130e186f5be5/html5/thumbnails/7.jpg)
new Log, new Clock
public RecipeRepositoryUsingNew()
{
Clock = new SystemClock();
Log = new Log();
}
![Page 8: Dependency Injection Grundlagen - Malte Clasenmalteclasen.de/blog/wp-content/uploads/2013/09/Dependency_Inject… · Test: Logs invalid Get [TestMethod] public void LogsInvalidGet()](https://reader034.fdocuments.in/reader034/viewer/2022050414/5f8b1cadc48b130e186f5be5/html5/thumbnails/8.jpg)
Test: Logs time on invalid Get
[TestMethod]
public void LogsTimeOnInvalidGet()
{
var repository = new RecipeRepositoryUsingNew();
repository.Invoking(r => r.Get(Guid.NewGuid()))
.ShouldThrow<ArgumentException>();
var entry = repository.Log.Get().First();
Math.Abs((entry.Time - DateTime.Now) .TotalSeconds.Should().BeLessThan(1);
}
![Page 9: Dependency Injection Grundlagen - Malte Clasenmalteclasen.de/blog/wp-content/uploads/2013/09/Dependency_Inject… · Test: Logs invalid Get [TestMethod] public void LogsInvalidGet()](https://reader034.fdocuments.in/reader034/viewer/2022050414/5f8b1cadc48b130e186f5be5/html5/thumbnails/9.jpg)
Clock-Interface
public interface IClock
{
DateTime Now { get; }
}
![Page 10: Dependency Injection Grundlagen - Malte Clasenmalteclasen.de/blog/wp-content/uploads/2013/09/Dependency_Inject… · Test: Logs invalid Get [TestMethod] public void LogsInvalidGet()](https://reader034.fdocuments.in/reader034/viewer/2022050414/5f8b1cadc48b130e186f5be5/html5/thumbnails/10.jpg)
System Clock
public class SystemClock : IClock
{
public DateTime Now
{
get { return DateTime.Now; }
}
}
![Page 11: Dependency Injection Grundlagen - Malte Clasenmalteclasen.de/blog/wp-content/uploads/2013/09/Dependency_Inject… · Test: Logs invalid Get [TestMethod] public void LogsInvalidGet()](https://reader034.fdocuments.in/reader034/viewer/2022050414/5f8b1cadc48b130e186f5be5/html5/thumbnails/11.jpg)
Static Clock
public class StaticClock : IClock
{
public DateTime Now { get; set; }
public StaticClock()
{
Now = new DateTime(2013, 1, 1);
}
}
![Page 12: Dependency Injection Grundlagen - Malte Clasenmalteclasen.de/blog/wp-content/uploads/2013/09/Dependency_Inject… · Test: Logs invalid Get [TestMethod] public void LogsInvalidGet()](https://reader034.fdocuments.in/reader034/viewer/2022050414/5f8b1cadc48b130e186f5be5/html5/thumbnails/12.jpg)
Clock via Factory
public RecipeRepositoryUsingFactory()
{
var logFactory = new LogFactory();
Log = logFactory.Get();
var clockFactory = new ClockFactory();
Clock = clockFactory.Get();
}
![Page 13: Dependency Injection Grundlagen - Malte Clasenmalteclasen.de/blog/wp-content/uploads/2013/09/Dependency_Inject… · Test: Logs invalid Get [TestMethod] public void LogsInvalidGet()](https://reader034.fdocuments.in/reader034/viewer/2022050414/5f8b1cadc48b130e186f5be5/html5/thumbnails/13.jpg)
Clock Factory
public IClock Get()
{
//todo: Context detection Voodoo to select clock type
return new SystemClock();
}
![Page 14: Dependency Injection Grundlagen - Malte Clasenmalteclasen.de/blog/wp-content/uploads/2013/09/Dependency_Inject… · Test: Logs invalid Get [TestMethod] public void LogsInvalidGet()](https://reader034.fdocuments.in/reader034/viewer/2022050414/5f8b1cadc48b130e186f5be5/html5/thumbnails/14.jpg)
Clock via Abstract Factory
public RecipeRepositoryUsingAbstractFactory
(ILogFactory logFactory, IClockFactory clockFactory)
{
Log = logFactory.Get();
Clock = clockFactory.Get();
}
![Page 15: Dependency Injection Grundlagen - Malte Clasenmalteclasen.de/blog/wp-content/uploads/2013/09/Dependency_Inject… · Test: Logs invalid Get [TestMethod] public void LogsInvalidGet()](https://reader034.fdocuments.in/reader034/viewer/2022050414/5f8b1cadc48b130e186f5be5/html5/thumbnails/15.jpg)
Clock Factory Interface
public interface IClockFactory
{
IClock Get();
}
![Page 16: Dependency Injection Grundlagen - Malte Clasenmalteclasen.de/blog/wp-content/uploads/2013/09/Dependency_Inject… · Test: Logs invalid Get [TestMethod] public void LogsInvalidGet()](https://reader034.fdocuments.in/reader034/viewer/2022050414/5f8b1cadc48b130e186f5be5/html5/thumbnails/16.jpg)
Test: Abstract Factory
public void LogsTimeOnInvalidGet()
{
ILogFactory logFactory = new LogFactory();
IClockFactory clockFactory =
new StaticClockFactory();
var repository =
new RecipeRepositoryUsingAbstractFactory
(logFactory, clockFactory);
var referenceTime = repository.Clock.Now;
...
repository.Log.Get().First().Time
.Should().Be(referenceTime);
}
![Page 17: Dependency Injection Grundlagen - Malte Clasenmalteclasen.de/blog/wp-content/uploads/2013/09/Dependency_Inject… · Test: Logs invalid Get [TestMethod] public void LogsInvalidGet()](https://reader034.fdocuments.in/reader034/viewer/2022050414/5f8b1cadc48b130e186f5be5/html5/thumbnails/17.jpg)
Clock via Service Locator
public RecipeRepositoryUsingServiceLocator()
{
_log = ServiceLocator.Log;
_clock = ServiceLocator.Clock;
}
![Page 18: Dependency Injection Grundlagen - Malte Clasenmalteclasen.de/blog/wp-content/uploads/2013/09/Dependency_Inject… · Test: Logs invalid Get [TestMethod] public void LogsInvalidGet()](https://reader034.fdocuments.in/reader034/viewer/2022050414/5f8b1cadc48b130e186f5be5/html5/thumbnails/18.jpg)
Service Locator Interface
public static class ServiceLocator
{
public static ILog Log { get; set; }
public static IClock Clock { get; set; }
}
![Page 19: Dependency Injection Grundlagen - Malte Clasenmalteclasen.de/blog/wp-content/uploads/2013/09/Dependency_Inject… · Test: Logs invalid Get [TestMethod] public void LogsInvalidGet()](https://reader034.fdocuments.in/reader034/viewer/2022050414/5f8b1cadc48b130e186f5be5/html5/thumbnails/19.jpg)
Test: Initialisierung
[TestMethod]
public void LogsInvalidGet()
{
ServiceLocator.Log = new Log();
ServiceLocator.Clock = new StaticClock();
var repository =
new RecipeRepositoryUsingServiceLocator();
repository.Invoking(r => r.Get(Guid.NewGuid()))
.ShouldThrow<ArgumentException>();
ServiceLocator.Log.Get().Should().HaveCount(1);
}
![Page 20: Dependency Injection Grundlagen - Malte Clasenmalteclasen.de/blog/wp-content/uploads/2013/09/Dependency_Inject… · Test: Logs invalid Get [TestMethod] public void LogsInvalidGet()](https://reader034.fdocuments.in/reader034/viewer/2022050414/5f8b1cadc48b130e186f5be5/html5/thumbnails/20.jpg)
private Log, Clock
public class RecipeRepositoryUsingServiceLocator : IRecipeRepository
{
private readonly Dictionary<Guid, Recipe> _recipes = new Dictionary<Guid, Recipe>();
private readonly ILog _log;
private readonly IClock _clock;
...
}
![Page 21: Dependency Injection Grundlagen - Malte Clasenmalteclasen.de/blog/wp-content/uploads/2013/09/Dependency_Inject… · Test: Logs invalid Get [TestMethod] public void LogsInvalidGet()](https://reader034.fdocuments.in/reader034/viewer/2022050414/5f8b1cadc48b130e186f5be5/html5/thumbnails/21.jpg)
Full run: passed
![Page 22: Dependency Injection Grundlagen - Malte Clasenmalteclasen.de/blog/wp-content/uploads/2013/09/Dependency_Inject… · Test: Logs invalid Get [TestMethod] public void LogsInvalidGet()](https://reader034.fdocuments.in/reader034/viewer/2022050414/5f8b1cadc48b130e186f5be5/html5/thumbnails/22.jpg)
NCrunch: failed
![Page 23: Dependency Injection Grundlagen - Malte Clasenmalteclasen.de/blog/wp-content/uploads/2013/09/Dependency_Inject… · Test: Logs invalid Get [TestMethod] public void LogsInvalidGet()](https://reader034.fdocuments.in/reader034/viewer/2022050414/5f8b1cadc48b130e186f5be5/html5/thumbnails/23.jpg)
NCrunch: failed
![Page 24: Dependency Injection Grundlagen - Malte Clasenmalteclasen.de/blog/wp-content/uploads/2013/09/Dependency_Inject… · Test: Logs invalid Get [TestMethod] public void LogsInvalidGet()](https://reader034.fdocuments.in/reader034/viewer/2022050414/5f8b1cadc48b130e186f5be5/html5/thumbnails/24.jpg)
Test: NullReferenceException
[TestMethod]
public void LogsMultipleInvalidGets()
{
ServiceLocator.Log = new Log();
var repository = new
RecipeRepositoryUsingServiceLocator();
repository.Invoking(r => r.Get(Guid.NewGuid()))
.ShouldThrow<ArgumentException>();
Expected System.ArgumentException, but found
System.NullReferenceException with message
"Object reference not set to an instance of an
object."
![Page 25: Dependency Injection Grundlagen - Malte Clasenmalteclasen.de/blog/wp-content/uploads/2013/09/Dependency_Inject… · Test: Logs invalid Get [TestMethod] public void LogsInvalidGet()](https://reader034.fdocuments.in/reader034/viewer/2022050414/5f8b1cadc48b130e186f5be5/html5/thumbnails/25.jpg)
isolierter Test: failed
![Page 26: Dependency Injection Grundlagen - Malte Clasenmalteclasen.de/blog/wp-content/uploads/2013/09/Dependency_Inject… · Test: Logs invalid Get [TestMethod] public void LogsInvalidGet()](https://reader034.fdocuments.in/reader034/viewer/2022050414/5f8b1cadc48b130e186f5be5/html5/thumbnails/26.jpg)
Test: Initialisierung vergessen
[TestMethod]
public void LogsMultipleInvalidGets()
{
ServiceLocator.Log = new Log();
ServiceLocator.Clock = new StaticClock();
var repository = new
RecipeRepositoryUsingServiceLocator();
![Page 27: Dependency Injection Grundlagen - Malte Clasenmalteclasen.de/blog/wp-content/uploads/2013/09/Dependency_Inject… · Test: Logs invalid Get [TestMethod] public void LogsInvalidGet()](https://reader034.fdocuments.in/reader034/viewer/2022050414/5f8b1cadc48b130e186f5be5/html5/thumbnails/27.jpg)
via Dependency Injection
public RecipeRepositoryUsingDependencyInjection
(ILog log, IClock clock)
{
_log = log;
_clock = clock;
}
![Page 28: Dependency Injection Grundlagen - Malte Clasenmalteclasen.de/blog/wp-content/uploads/2013/09/Dependency_Inject… · Test: Logs invalid Get [TestMethod] public void LogsInvalidGet()](https://reader034.fdocuments.in/reader034/viewer/2022050414/5f8b1cadc48b130e186f5be5/html5/thumbnails/28.jpg)
Test: explizite Parameter
[TestMethod]
public void LogsInvalidGet()
{
var log = new Log();
var clock = new StaticClock();
var repository =
new RecipeRepositoryUsingDependencyInjection
(log, clock);
repository.Invoking(r => r.Get(Guid.NewGuid()))
.ShouldThrow<ArgumentException>();
log.Get().Should().HaveCount(1);
}
![Page 29: Dependency Injection Grundlagen - Malte Clasenmalteclasen.de/blog/wp-content/uploads/2013/09/Dependency_Inject… · Test: Logs invalid Get [TestMethod] public void LogsInvalidGet()](https://reader034.fdocuments.in/reader034/viewer/2022050414/5f8b1cadc48b130e186f5be5/html5/thumbnails/29.jpg)
Test: exakte Zeit
[TestMethod]
public void LogsTimeOnInvalidGet()
{
var log = new Log();
var clock = new StaticClock();
var repository =
new RecipeRepositoryUsingDependencyInjection
(log, clock);
repository.Invoking(r => r.Get(Guid.NewGuid()))
.ShouldThrow<ArgumentException>();
log.Get().First().Time.Should().Be(clock.Now);
}
![Page 30: Dependency Injection Grundlagen - Malte Clasenmalteclasen.de/blog/wp-content/uploads/2013/09/Dependency_Inject… · Test: Logs invalid Get [TestMethod] public void LogsInvalidGet()](https://reader034.fdocuments.in/reader034/viewer/2022050414/5f8b1cadc48b130e186f5be5/html5/thumbnails/30.jpg)
Test: Mock
var log = new Mock<ILog>();
log.Setup(l => l.Error(It.IsAny<DateTime>(),
It.IsAny<string>()));
var clock = new Mock<IClock>();
var repository =
new RecipeRepositoryUsingDependencyInjection
(log.Object, clock.Object);
repository.Invoking(r => r.Get(Guid.NewGuid()))
.ShouldThrow<ArgumentException>();
log.Verify(l => l.Error(It.IsAny<DateTime>(),
It.IsAny<string>()), Times.Exactly(1));
![Page 31: Dependency Injection Grundlagen - Malte Clasenmalteclasen.de/blog/wp-content/uploads/2013/09/Dependency_Inject… · Test: Logs invalid Get [TestMethod] public void LogsInvalidGet()](https://reader034.fdocuments.in/reader034/viewer/2022050414/5f8b1cadc48b130e186f5be5/html5/thumbnails/31.jpg)
moq
![Page 32: Dependency Injection Grundlagen - Malte Clasenmalteclasen.de/blog/wp-content/uploads/2013/09/Dependency_Inject… · Test: Logs invalid Get [TestMethod] public void LogsInvalidGet()](https://reader034.fdocuments.in/reader034/viewer/2022050414/5f8b1cadc48b130e186f5be5/html5/thumbnails/32.jpg)
Test: Auto-Mock
[TestMethod]
public void ThrowsOnInvalidGet()
{
var fixture = new Fixture()
.Customize(new AutoMoqCustomization());
var repository = fixture.Create
<RecipeRepositoryUsingDependencyInjection>();
repository.Invoking(r => r.Get(Guid.NewGuid()))
.ShouldThrow<ArgumentException>();
}
![Page 33: Dependency Injection Grundlagen - Malte Clasenmalteclasen.de/blog/wp-content/uploads/2013/09/Dependency_Inject… · Test: Logs invalid Get [TestMethod] public void LogsInvalidGet()](https://reader034.fdocuments.in/reader034/viewer/2022050414/5f8b1cadc48b130e186f5be5/html5/thumbnails/33.jpg)
AutoFixture
![Page 34: Dependency Injection Grundlagen - Malte Clasenmalteclasen.de/blog/wp-content/uploads/2013/09/Dependency_Inject… · Test: Logs invalid Get [TestMethod] public void LogsInvalidGet()](https://reader034.fdocuments.in/reader034/viewer/2022050414/5f8b1cadc48b130e186f5be5/html5/thumbnails/34.jpg)
Inversion of Control
• gegen Interfaces programmieren
• Implementierung zuliefern lassen
• Abhängigkeiten automatisch
auflösen
![Page 35: Dependency Injection Grundlagen - Malte Clasenmalteclasen.de/blog/wp-content/uploads/2013/09/Dependency_Inject… · Test: Logs invalid Get [TestMethod] public void LogsInvalidGet()](https://reader034.fdocuments.in/reader034/viewer/2022050414/5f8b1cadc48b130e186f5be5/html5/thumbnails/35.jpg)
Ninject
![Page 36: Dependency Injection Grundlagen - Malte Clasenmalteclasen.de/blog/wp-content/uploads/2013/09/Dependency_Inject… · Test: Logs invalid Get [TestMethod] public void LogsInvalidGet()](https://reader034.fdocuments.in/reader034/viewer/2022050414/5f8b1cadc48b130e186f5be5/html5/thumbnails/36.jpg)
Test: Ninject
var kernel = new StandardKernel();
kernel.Bind<IClock>().To<StaticClock>();
kernel.Bind<ILog>().To<Log>().InSingletonScope();
kernel.Bind<IRecipeRepository>()
.To<RecipeRepositoryUsingDependencyInjection>();
var log = kernel.Get<ILog>();
var repository = kernel.Get<IRecipeRepository>();
repository.Invoking(r => r.Get(Guid.NewGuid()))
.ShouldThrow<ArgumentException>();
log.Get().Should().HaveCount(1);
![Page 37: Dependency Injection Grundlagen - Malte Clasenmalteclasen.de/blog/wp-content/uploads/2013/09/Dependency_Inject… · Test: Logs invalid Get [TestMethod] public void LogsInvalidGet()](https://reader034.fdocuments.in/reader034/viewer/2022050414/5f8b1cadc48b130e186f5be5/html5/thumbnails/37.jpg)
Test: Ninject
var kernel = new StandardKernel();
kernel.Bind<IClock>().To<StaticClock>();
kernel.Bind<ILog>().To<Log>().InSingletonScope();
kernel.Bind<IRecipeRepository>()
.To<RecipeRepositoryUsingDependencyInjection>();
var log = kernel.Get<ILog>();
var repository = kernel.Get<IRecipeRepository>();
repository.Invoking(r => r.Get(Guid.NewGuid()))
.ShouldThrow<ArgumentException>();
log.Get().Should().HaveCount(1);
![Page 38: Dependency Injection Grundlagen - Malte Clasenmalteclasen.de/blog/wp-content/uploads/2013/09/Dependency_Inject… · Test: Logs invalid Get [TestMethod] public void LogsInvalidGet()](https://reader034.fdocuments.in/reader034/viewer/2022050414/5f8b1cadc48b130e186f5be5/html5/thumbnails/38.jpg)
Castle Windsor
![Page 39: Dependency Injection Grundlagen - Malte Clasenmalteclasen.de/blog/wp-content/uploads/2013/09/Dependency_Inject… · Test: Logs invalid Get [TestMethod] public void LogsInvalidGet()](https://reader034.fdocuments.in/reader034/viewer/2022050414/5f8b1cadc48b130e186f5be5/html5/thumbnails/39.jpg)
Test: Castle Windsor
var container = new WindsorContainer();
container.Register(Component.For<ILog>()
.ImplementedBy<Log>().LifestyleSingleton());
container.Register(Component.For<IClock>()
.ImplementedBy<StaticClock>());
container.Register(Component.For<IRecipeRepository>()
.ImplementedBy<RecipeRepositoryUsingDependencyInjection>().LifestyleTransient());
var log = container.Resolve<ILog>();
var repository = container.Resolve<IRecipeRepository>();
![Page 40: Dependency Injection Grundlagen - Malte Clasenmalteclasen.de/blog/wp-content/uploads/2013/09/Dependency_Inject… · Test: Logs invalid Get [TestMethod] public void LogsInvalidGet()](https://reader034.fdocuments.in/reader034/viewer/2022050414/5f8b1cadc48b130e186f5be5/html5/thumbnails/40.jpg)
StructureMap
![Page 41: Dependency Injection Grundlagen - Malte Clasenmalteclasen.de/blog/wp-content/uploads/2013/09/Dependency_Inject… · Test: Logs invalid Get [TestMethod] public void LogsInvalidGet()](https://reader034.fdocuments.in/reader034/viewer/2022050414/5f8b1cadc48b130e186f5be5/html5/thumbnails/41.jpg)
Test: StructureMap
var container = new Container(x =>
{
x.For<ILog>().Singleton().Use<Log>();
x.For<IClock>().Use<StaticClock>();
x.For<IRecipeRepository>().
Use<RecipeRepositoryUsingDependencyInjection>();
});
var log = container.GetInstance<ILog>();
var repository =
container.GetInstance<IRecipeRepository>();
![Page 42: Dependency Injection Grundlagen - Malte Clasenmalteclasen.de/blog/wp-content/uploads/2013/09/Dependency_Inject… · Test: Logs invalid Get [TestMethod] public void LogsInvalidGet()](https://reader034.fdocuments.in/reader034/viewer/2022050414/5f8b1cadc48b130e186f5be5/html5/thumbnails/42.jpg)
Unity
![Page 43: Dependency Injection Grundlagen - Malte Clasenmalteclasen.de/blog/wp-content/uploads/2013/09/Dependency_Inject… · Test: Logs invalid Get [TestMethod] public void LogsInvalidGet()](https://reader034.fdocuments.in/reader034/viewer/2022050414/5f8b1cadc48b130e186f5be5/html5/thumbnails/43.jpg)
Test: Unity
var container = new UnityContainer();
container
.RegisterType<ILog, Log>(
new ContainerControlledLifetimeManager())
.RegisterType<IClock, StaticClock>()
.RegisterType<IRecipeRepository,
RecipeRepositoryUsingDependencyInjection>();
var log = container.Resolve<ILog>();
var repository = container.Resolve<IRecipeRepository>();
![Page 44: Dependency Injection Grundlagen - Malte Clasenmalteclasen.de/blog/wp-content/uploads/2013/09/Dependency_Inject… · Test: Logs invalid Get [TestMethod] public void LogsInvalidGet()](https://reader034.fdocuments.in/reader034/viewer/2022050414/5f8b1cadc48b130e186f5be5/html5/thumbnails/44.jpg)
Kernel als Parameter
Nicht den Kernel als Parameter
übergeben, Kernel ist keine Factory!
![Page 45: Dependency Injection Grundlagen - Malte Clasenmalteclasen.de/blog/wp-content/uploads/2013/09/Dependency_Inject… · Test: Logs invalid Get [TestMethod] public void LogsInvalidGet()](https://reader034.fdocuments.in/reader034/viewer/2022050414/5f8b1cadc48b130e186f5be5/html5/thumbnails/45.jpg)
Console Application
class RecipeCounter
{
private readonly SystemClock _clock;
private readonly RecipeRepositoryUsingDependencyInjection _repository;
public RecipeCounter(SystemClock clock,
RecipeRepositoryUsingDependencyInjection
repository)
{
_clock = clock;
_repository = repository;
}
![Page 46: Dependency Injection Grundlagen - Malte Clasenmalteclasen.de/blog/wp-content/uploads/2013/09/Dependency_Inject… · Test: Logs invalid Get [TestMethod] public void LogsInvalidGet()](https://reader034.fdocuments.in/reader034/viewer/2022050414/5f8b1cadc48b130e186f5be5/html5/thumbnails/46.jpg)
Console Application
public void Write()
{
System.Console.WriteLine(
"There are {0} recipes available at {1}.",
_repository.Count, _clock.Now.ToLongTimeString());
}
}
![Page 47: Dependency Injection Grundlagen - Malte Clasenmalteclasen.de/blog/wp-content/uploads/2013/09/Dependency_Inject… · Test: Logs invalid Get [TestMethod] public void LogsInvalidGet()](https://reader034.fdocuments.in/reader034/viewer/2022050414/5f8b1cadc48b130e186f5be5/html5/thumbnails/47.jpg)
Console Application
static void Main(string[] args)
{
var kernel = new StandardKernel();
kernel.Bind<IClock>().To<SystemClock>();
kernel.Bind<ILog>().To<Log>();
kernel.Bind<IRecipeRepository>().
To<RecipeRepositoryUsingDependencyInjection>();
var recipeCounter = kernel.Get<RecipeCounter>();
recipeCounter.Write();
}
![Page 48: Dependency Injection Grundlagen - Malte Clasenmalteclasen.de/blog/wp-content/uploads/2013/09/Dependency_Inject… · Test: Logs invalid Get [TestMethod] public void LogsInvalidGet()](https://reader034.fdocuments.in/reader034/viewer/2022050414/5f8b1cadc48b130e186f5be5/html5/thumbnails/48.jpg)
ASP.NET MVC
[assembly: WebActivator.PreApplicationStartMethod(typeof(DependencyInjectionDemo.WebMvc.App_Start.NinjectWebCommon), "Start")]
[assembly: WebActivator.ApplicationShutdownMethodAttribute(typeof(DependencyInjectionDemo.WebMvc.App_Start.NinjectWebCommon), "Stop")]
public static class NinjectWebCommon
{
...
}
![Page 49: Dependency Injection Grundlagen - Malte Clasenmalteclasen.de/blog/wp-content/uploads/2013/09/Dependency_Inject… · Test: Logs invalid Get [TestMethod] public void LogsInvalidGet()](https://reader034.fdocuments.in/reader034/viewer/2022050414/5f8b1cadc48b130e186f5be5/html5/thumbnails/49.jpg)
ASP.NET MVC
public static void Start()
{
DynamicModuleUtility.RegisterModule(
typeof(OnePerRequestHttpModule));
DynamicModuleUtility.RegisterModule(
typeof(NinjectHttpModule));
bootstrapper.Initialize(CreateKernel);
}
public static void Stop()
{
bootstrapper.ShutDown();
}
![Page 50: Dependency Injection Grundlagen - Malte Clasenmalteclasen.de/blog/wp-content/uploads/2013/09/Dependency_Inject… · Test: Logs invalid Get [TestMethod] public void LogsInvalidGet()](https://reader034.fdocuments.in/reader034/viewer/2022050414/5f8b1cadc48b130e186f5be5/html5/thumbnails/50.jpg)
ASP.NET MVC
private static IKernel CreateKernel()
{
var kernel = new StandardKernel();
kernel.Bind<Func<IKernel>>().ToMethod(
ctx => () => new Bootstrapper().Kernel);
kernel.Bind<IHttpModule>()
.To<HttpApplicationInitializationHttpModule>();
RegisterServices(kernel);
return kernel;
}
![Page 51: Dependency Injection Grundlagen - Malte Clasenmalteclasen.de/blog/wp-content/uploads/2013/09/Dependency_Inject… · Test: Logs invalid Get [TestMethod] public void LogsInvalidGet()](https://reader034.fdocuments.in/reader034/viewer/2022050414/5f8b1cadc48b130e186f5be5/html5/thumbnails/51.jpg)
ASP.NET MVC
private static void RegisterServices(IKernel kernel)
{
kernel.Bind<IClock>().To<SystemClock>();
kernel.Bind<ILog>().To<Log>();
kernel.Bind<IRecipeRepository>().
To<RecipeRepositoryUsingDependencyInjection>();
}
![Page 52: Dependency Injection Grundlagen - Malte Clasenmalteclasen.de/blog/wp-content/uploads/2013/09/Dependency_Inject… · Test: Logs invalid Get [TestMethod] public void LogsInvalidGet()](https://reader034.fdocuments.in/reader034/viewer/2022050414/5f8b1cadc48b130e186f5be5/html5/thumbnails/52.jpg)
ASP.NET MVC: Controller
public HomeController(IClock clock,
IRecipeRepository repository)
{
_clock = clock;
_repository = repository;
}
![Page 53: Dependency Injection Grundlagen - Malte Clasenmalteclasen.de/blog/wp-content/uploads/2013/09/Dependency_Inject… · Test: Logs invalid Get [TestMethod] public void LogsInvalidGet()](https://reader034.fdocuments.in/reader034/viewer/2022050414/5f8b1cadc48b130e186f5be5/html5/thumbnails/53.jpg)
SharePoint
„The SharePoint Service Locator is a
reusable component that provides a
simple implementation of the service
locator pattern.”
[MSDN, Application Foundations for
SharePoint 2010]
Anti-Pattern
![Page 54: Dependency Injection Grundlagen - Malte Clasenmalteclasen.de/blog/wp-content/uploads/2013/09/Dependency_Inject… · Test: Logs invalid Get [TestMethod] public void LogsInvalidGet()](https://reader034.fdocuments.in/reader034/viewer/2022050414/5f8b1cadc48b130e186f5be5/html5/thumbnails/54.jpg)
Konstruktor vs. Property private class SelfInjectingClass {
[Inject] public ILog Log { get; set; } public SelfInjectingClass() {
KernelLocator.Kernel.Inject(this); } public SelfInjectingClass(ILog log) {
Log = log; }
}
![Page 55: Dependency Injection Grundlagen - Malte Clasenmalteclasen.de/blog/wp-content/uploads/2013/09/Dependency_Inject… · Test: Logs invalid Get [TestMethod] public void LogsInvalidGet()](https://reader034.fdocuments.in/reader034/viewer/2022050414/5f8b1cadc48b130e186f5be5/html5/thumbnails/55.jpg)
Inject This
[TestMethod]
public void InjectThis()
{
var kernel = new StandardKernel();
KernelLocator.Kernel = kernel;
kernel.Bind<ILog>().To<Log>().InSingletonScope();
var selfInjectingClass = new SelfInjectingClass();
selfInjectingClass.Log.Should().NotBeNull();
}
![Page 56: Dependency Injection Grundlagen - Malte Clasenmalteclasen.de/blog/wp-content/uploads/2013/09/Dependency_Inject… · Test: Logs invalid Get [TestMethod] public void LogsInvalidGet()](https://reader034.fdocuments.in/reader034/viewer/2022050414/5f8b1cadc48b130e186f5be5/html5/thumbnails/56.jpg)
Inject
[TestMethod]
public void Inject()
{
var kernel = new StandardKernel();
kernel.Bind<ILog>().To<Log>().InSingletonScope();
var selfInjectingClass =
kernel.Get<SelfInjectingClass>();
selfInjectingClass.Log.Should().NotBeNull();
}
![Page 57: Dependency Injection Grundlagen - Malte Clasenmalteclasen.de/blog/wp-content/uploads/2013/09/Dependency_Inject… · Test: Logs invalid Get [TestMethod] public void LogsInvalidGet()](https://reader034.fdocuments.in/reader034/viewer/2022050414/5f8b1cadc48b130e186f5be5/html5/thumbnails/57.jpg)
Zusammenfassung
• Abhängigkeiten automatisch auflösen
• Lebenzyklen beachten
• Work-Around für Frameworks möglich
• Folien, Code
http://malteclasen.de/blog
• Beratung, Training