Here are some helpful links:
- Setting Up the Unity Container
- Unity Samples
- How not to do dependency injection
- Good description of Unity lifetime managers
- Which referenced Unity assemblies are needed and what for
interface ITextService { string Text { get; set; } } internal class TextService : ITextService { public string Text { get; set; } }With the simplest form of Unity registration, invoking 'Resolve' creates a new instance of the service each time
public void RegisterServiceNewInstanceEachTimeTest() { IUnityContainer myContainer = new UnityContainer(); myContainer.RegisterType<ITextService, TextService>(); // Create a TestService instance ITextService svc1 = myContainer.Resolve<ITextService>(); svc1.Text = "Doombar"; // Creates a new TestService instance ITextService svc2 = myContainer.Resolve<ITextService>(); Assert.AreNotEqual(svc1.Text, svc2.Text, false); }Resolve creates a new instance of the service each time however this time the service is registered against a string name or label that can be used to identify and retrieve it
public void RegisterNamedServiceNewInstanceEachTimeTest() { IUnityContainer myContainer = new UnityContainer(); myContainer.RegisterType<ITextService, TextService>("MyTextService"); ITextService svc1 = myContainer.Resolve<ITextService>("MyTextService"); svc1.Text = "Doombar"; ITextService svc2 = myContainer.Resolve<ITextService>("MyTextService"); Assert.AreNotEqual(svc1.Text, svc2.Text, false); Assert.IsFalse(ReferenceEquals(svc1, svc2)); }A particular instance of a service object can be registered against the 'ITextService' type, this gives a way of registering singleton objects.
public void RegisterSpecificInstanceForServivceTest() { IUnityContainer myContainer = new UnityContainer(); TextService svc1 = new TextService(); svc1.Text = "Doombar"; myContainer.RegisterInstance<ITextService>(svc1); ITextService svc2 = myContainer.Resolve<ITextService>(); Assert.AreEqual(svc1.Text, svc2.Text, false); Assert.IsTrue(ReferenceEquals(svc1, svc2)); }Injection of service via a constructor First, define a demo class:
internal class ConstructorInjectedClass { ITextService testSvc = null; public ConstructorInjectedClass(ITextService mysvc) { testSvc = mysvc; // work with the dependent instance testSvc.Text = "Yeehah!"; } public ITextService TestService { get { return testSvc; } } }Now use Unity to perform the dependency injection:
public void ConstructorInjectionTest() { IUnityContainer uContainer = new UnityContainer(); uContainer.RegisterType<ITextService, TextService>(); // Unity will look at all the objects required to construct the 'ConstructorInjectedClass' // object and automatically resolve them ConstructorInjectedClass myInstance = uContainer.Resolve<ConstructorInjectedClass>(); Assert.IsNotNull(myInstance.TestService); }Multiple services can also be defined against a single type and retrieved:
public void ResolveAllTest() { IUnityContainer uContainer = new UnityContainer(); uContainer.RegisterType<ITextService, TextService>("textService1"); uContainer.RegisterType<ITextService, DifferentTextService>("textService2"); // Now there are 2 services registered as an ITextService // Use 'ResolveAll' to get all the services implementing the named type var textServices = uContainer.ResolveAll<ITextService>(); int ix = 0; foreach (var ts in textServices) { ++ix; ts.Text = ix.ToString(); } Assert.AreEqual(2, textServices.Count()); }Perfect for the case when multiple logger services are used for logging, a debug output logger, a rolling file logger, and so on.
No comments:
Post a Comment