mirror of
https://github.com/mbierlee/poodinis.git
synced 2024-11-15 04:04:01 +01:00
Pass factory through constructor to prevent nullpointer exceptions
This commit is contained in:
parent
941c5b1961
commit
81c6faed16
|
@ -205,8 +205,8 @@ public deprecated void globalAutowire(Type)(Type instance) {
|
||||||
class AutowiredRegistration(RegistrationType : Object) : Registration {
|
class AutowiredRegistration(RegistrationType : Object) : Registration {
|
||||||
private shared(DependencyContainer) container;
|
private shared(DependencyContainer) container;
|
||||||
|
|
||||||
public this(TypeInfo registeredType, shared(DependencyContainer) originatingContainer) {
|
public this(TypeInfo registeredType, InstanceFactory instanceFactory, shared(DependencyContainer) originatingContainer) {
|
||||||
super(registeredType, typeid(RegistrationType), originatingContainer);
|
super(registeredType, typeid(RegistrationType), instanceFactory, originatingContainer);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override Object getInstance(InstantiationContext context = new AutowireInstantiationContext()) {
|
public override Object getInstance(InstantiationContext context = new AutowireInstantiationContext()) {
|
||||||
|
|
|
@ -147,8 +147,7 @@ synchronized class DependencyContainer {
|
||||||
return existingRegistration;
|
return existingRegistration;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto newRegistration = new AutowiredRegistration!ConcreteType(registeredType, this);
|
auto newRegistration = new AutowiredRegistration!ConcreteType(registeredType, new InstanceFactory(), this);
|
||||||
newRegistration.instanceFactory = new InstanceFactory();
|
|
||||||
newRegistration.singleInstance();
|
newRegistration.singleInstance();
|
||||||
|
|
||||||
static if (!is(SuperType == ConcreteType)) {
|
static if (!is(SuperType == ConcreteType)) {
|
||||||
|
|
|
@ -62,9 +62,7 @@ public void registerContextComponents(ApplicationContextType : ApplicationContex
|
||||||
registration = container.register!(ReturnType!factoryMethod);
|
registration = container.register!(ReturnType!factoryMethod);
|
||||||
}
|
}
|
||||||
|
|
||||||
auto instanceFactory = new InstanceFactory();
|
registration.instanceFactory.factoryParameters = InstanceFactoryParameters(registration.instanceType, createsSingleton, null, factoryMethod);
|
||||||
instanceFactory.factoryParameters = InstanceFactoryParameters(registration.instanceType, createsSingleton, null, factoryMethod);
|
|
||||||
registration.instanceFactory = instanceFactory;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,6 +21,7 @@ class Registration {
|
||||||
private TypeInfo_Class _instanceType = null;
|
private TypeInfo_Class _instanceType = null;
|
||||||
private Registration linkedRegistration;
|
private Registration linkedRegistration;
|
||||||
private shared(DependencyContainer) _originatingContainer;
|
private shared(DependencyContainer) _originatingContainer;
|
||||||
|
private InstanceFactory _instanceFactory;
|
||||||
|
|
||||||
public @property registeredType() {
|
public @property registeredType() {
|
||||||
return _registeredType;
|
return _registeredType;
|
||||||
|
@ -34,12 +35,15 @@ class Registration {
|
||||||
return _originatingContainer;
|
return _originatingContainer;
|
||||||
}
|
}
|
||||||
|
|
||||||
public InstanceFactory instanceFactory = null;
|
public @property instanceFactory() {
|
||||||
|
return _instanceFactory;
|
||||||
|
}
|
||||||
|
|
||||||
this(TypeInfo registeredType, TypeInfo_Class instanceType, shared(DependencyContainer) originatingContainer) {
|
this(TypeInfo registeredType, TypeInfo_Class instanceType, InstanceFactory instanceFactory, shared(DependencyContainer) originatingContainer) {
|
||||||
this._registeredType = registeredType;
|
this._registeredType = registeredType;
|
||||||
this._instanceType = instanceType;
|
this._instanceType = instanceType;
|
||||||
this._originatingContainer = originatingContainer;
|
this._originatingContainer = originatingContainer;
|
||||||
|
this._instanceFactory = instanceFactory;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Object getInstance(InstantiationContext context = new InstantiationContext()) {
|
public Object getInstance(InstantiationContext context = new InstantiationContext()) {
|
||||||
|
|
|
@ -185,7 +185,7 @@ version(unittest) {
|
||||||
auto container = new shared DependencyContainer();
|
auto container = new shared DependencyContainer();
|
||||||
container.register!ComponentA;
|
container.register!ComponentA;
|
||||||
|
|
||||||
auto registration = new AutowiredRegistration!ComponentB(typeid(ComponentB), container).singleInstance();
|
auto registration = new AutowiredRegistration!ComponentB(typeid(ComponentB), new InstanceFactory(), container).singleInstance();
|
||||||
auto instance = cast(ComponentB) registration.getInstance(new AutowireInstantiationContext());
|
auto instance = cast(ComponentB) registration.getInstance(new AutowireInstantiationContext());
|
||||||
|
|
||||||
assert(instance.componentA !is null);
|
assert(instance.componentA !is null);
|
||||||
|
|
|
@ -20,13 +20,13 @@ version(unittest) {
|
||||||
|
|
||||||
// Test getting instance without scope defined throws exception
|
// Test getting instance without scope defined throws exception
|
||||||
unittest {
|
unittest {
|
||||||
Registration registration = new Registration(typeid(TestType), null, null);
|
Registration registration = new Registration(typeid(TestType), null, null, null);
|
||||||
assertThrown!(InstanceCreationException)(registration.getInstance(), null);
|
assertThrown!(InstanceCreationException)(registration.getInstance(), null);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Test set single instance scope using scope setter
|
// Test set single instance scope using scope setter
|
||||||
unittest {
|
unittest {
|
||||||
Registration registration = new Registration(null, typeid(TestType), null);
|
Registration registration = new Registration(null, typeid(TestType), new InstanceFactory(), null);
|
||||||
auto chainedRegistration = registration.singleInstance();
|
auto chainedRegistration = registration.singleInstance();
|
||||||
auto instance1 = registration.getInstance();
|
auto instance1 = registration.getInstance();
|
||||||
auto instance2 = registration.getInstance();
|
auto instance2 = registration.getInstance();
|
||||||
|
@ -36,7 +36,7 @@ version(unittest) {
|
||||||
|
|
||||||
// Test set new instance scope using scope setter
|
// Test set new instance scope using scope setter
|
||||||
unittest {
|
unittest {
|
||||||
Registration registration = new Registration(null, typeid(TestType), null);
|
Registration registration = new Registration(null, typeid(TestType), new InstanceFactory(), null);
|
||||||
auto chainedRegistration = registration.newInstance();
|
auto chainedRegistration = registration.newInstance();
|
||||||
auto instance1 = registration.getInstance();
|
auto instance1 = registration.getInstance();
|
||||||
auto instance2 = registration.getInstance();
|
auto instance2 = registration.getInstance();
|
||||||
|
@ -46,7 +46,7 @@ version(unittest) {
|
||||||
|
|
||||||
// Test set existing instance scope using scope setter
|
// Test set existing instance scope using scope setter
|
||||||
unittest {
|
unittest {
|
||||||
Registration registration = new Registration(null, null, null);
|
Registration registration = new Registration(null, null, new InstanceFactory(), null);
|
||||||
auto expectedInstance = new TestType();
|
auto expectedInstance = new TestType();
|
||||||
auto chainedRegistration = registration.existingInstance(expectedInstance);
|
auto chainedRegistration = registration.existingInstance(expectedInstance);
|
||||||
auto actualInstance = registration.getInstance();
|
auto actualInstance = registration.getInstance();
|
||||||
|
@ -56,8 +56,8 @@ version(unittest) {
|
||||||
|
|
||||||
// Test linking registrations
|
// Test linking registrations
|
||||||
unittest {
|
unittest {
|
||||||
Registration firstRegistration = new Registration(typeid(TestInterface), typeid(TestImplementation), null).singleInstance();
|
Registration firstRegistration = new Registration(typeid(TestInterface), typeid(TestImplementation), new InstanceFactory(), null).singleInstance();
|
||||||
Registration secondRegistration = new Registration(typeid(TestImplementation), typeid(TestImplementation), null).singleInstance().linkTo(firstRegistration);
|
Registration secondRegistration = new Registration(typeid(TestImplementation), typeid(TestImplementation), new InstanceFactory(), null).singleInstance().linkTo(firstRegistration);
|
||||||
|
|
||||||
auto firstInstance = firstRegistration.getInstance();
|
auto firstInstance = firstRegistration.getInstance();
|
||||||
auto secondInstance = secondRegistration.getInstance();
|
auto secondInstance = secondRegistration.getInstance();
|
||||||
|
|
Loading…
Reference in a new issue