[ProgClub list] What is IoC?

Stuart Laughlin stuart at bistrotech.net
Thu Oct 13 02:09:48 AEDT 2011


On Tue, Oct 11, 2011 at 7:15 AM, John Elliot <jj5 at progclub.org> wrote:
>
> I try to avoid the keyword 'new' in all of my (non-trivial) software. I
> create static factory methods on my concrete types to obviate the need for
> new-ing types (you call the factory method instead, and it fails if it has
> to *before* the new object is created, constructors on the other hand run
> after the instance has been created). I then wrap these factory methods in
> an abstract factory, concrete implementations of which defer to classes'
> factory methods. So I have AbstractFactory calls FactoryMethod calls new.
> AbstractFactory picks an implementation (e.g. debug or production),
> FactoryMethod validates parameters, new is private and receives
> instantiation state from its factory method which has validated that state.
>

What does that code look like? Reading your description I can't work
out whether Notifier's static CreateInstance() method would receive an
IMessageClient parameter, or if that method would obtain an instance
from the factory (in which case I can't work out how you get the
factory into Notifier).

	public abstract class BaseFactory {
		public abstract Notifier CreateNotifier();
		public abstract IMessageClient CreateMessageClient();
	}
	
	public class ProductionFactory : BaseFactory {
		public override Notifier CreateNotifier ()
		{
			// maybe I pass new EmailSender() here?
			return Notifier.CreateInstance();
		}
		
		public override IMessageClient CreateMessageClient ()
		{
			return EmailSender.CreateInstance();
		}
	}

	public class Notifier
	{
		private readonly IMessageClient sender;

		private Notifier (IMessageClient sender)
		{
			this.sender = sender;
		}
		
		public static Notifier CreateInstance() {
			// I think I need an IMessageClient to pass to my constructor
			// (or would you not pass it in on the ctor?)
			// Do I get that from my factory or does it get passed in here?
		}

		public void NotifyUsers (IEnumerable<User> users, string message)
		{
			foreach (var user in users) {
				this.sender.Send (message, user);
			}
		}
	}

You mentioned earlier that this factory/config scenario essentially
fills the role of an IoC container, and I would tend to agree.
However, so far it appears to me that an IoC container accomplishes
this in a more simple and elegant way, according to my tastes anyway.
I'll keep going with my explanation and see if you agree.


--Stuart


--Stuart



More information about the list mailing list