Вы можете создать свой собственный простой объектный контейнер, если вы не можете использовать сторонний (что глупо, но я понимаю, я был там раньше)
вот что я подхватил,мог бы начать ... не проверял, и это действительно грубо, но, надеюсь, вы поняли идею
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 до того, как ониДелайте то же самое со множеством дополнительных тонкостей, таких как обход графа объектов и автоматическая регистрация объектов на основе соглашений, управление жизненным циклом объектов, определение области действия контейнеров и т. д. - многое из этого вы также можете реализовать самостоятельно.... но вы просто должны использовать проверенное и верное решение, такое как StructureMap