你可以建立自己的簡單對象容器,如果你不能使用第三方一個(這是愚蠢的,但我明白,我以前去過那裏)
這裏的東西,我掀起了可能讓你開始......沒有測試它,它真的是粗糙,但希望你的想法
public static class ObjectFactory
{
static IDictionary<Type, object> _factory = new Dictionary<Type, object>();
public static void Register<T>(Func<T> builder)
{
if (_factory.ContainsKey(typeof(T)))
_factory[typeof(T)] = builder;
else
_factory.Add(typeof(T), builder);
}
public static T GetInstance<T>()
{
if (_factory.ContainsKey(typeof(T)))
throw new ArgumentException(string.Format("Type <{0}> not registered in ObjectFactory", typeof(T).Name));
return ((Func<T>)_factory[typeof(T)])();
}
}
public interface IClientManager { }
public class RealClientManager : IClientManager { }
public class MockClientManager : IClientManager { }
public class MyView
{
public MyView()
{
// probably better to do this registry in some sort of application initialization
ObjectFactory.Register<IClientManager>(() => new RealClientManager());
}
public void SomeMethodThatNeedsClientManager()
{
var clientManager = ObjectFactory.GetInstance<IClientManager>();
}
}
public class MyTester
{
[TestMethod()]
public void SomeTest()
{
var view = new MyView();
// swap the client manager in the test
ObjectFactory.Register<IClientManager>(() => new MockClientManager());
// Asserts
}
}
你可以看到,如果你已經使用StructureMap或其他一些DI容器之前他們做了很多同樣的事情還有很多額外的細節,比如遍歷對象圖並根據約定自動註冊對象,管理對象lif ecycles,容器範圍等等......很多這些東西你也可以實現......但是你應該真的使用了一個經過驗證的真正解決方案,比如StructureMap