Qt MetaObject System を使用した DI IoC 開発を行っています。
class Resolver
{
public:
template <typename BaseType, typename DerivedType>
void Bind() { ... }
template <typename T>
T* Resolve() { ... }
...
private:
QObject* ResolveByName(QString typeName) { ... }
QHash<QString, QMetaObject> _container;
...
}
Bind メソッドは型に関する情報を に格納し_container
、Resolve
メソッドはこの情報を使用してインスタンスを作成します。私はQMetaObject::newInstance(QGenericArgumet arg1, QGenericArgumet arg2, ...)
解決する再帰的なコンストラクター引数を使用しています。たとえば、次のようなクラスがあります。
class IUserService { ... }
class NativeUserService : public IUserService
{
NativeUserService(IUserRepository* userRepository) { ... }
}
クライアントがこれを呼び出した後:
IUserService* userService = resolver.Resolve<IUserService>();
Resolver calls ResolveByName("IUserService*"):
QObject* ResolveByName(Qstring typeName)
{
QMetaObject meta = _container.value(typeName);
...
for (quint8 index = 0; index < 10; index++)
{
...
QString argType = constructorType.parameterTypes().at(index);
QObject *argValue = ResolveByName(argType);
ctorArgs << QGenericArgument(???);
}
...
return meta.newInstance(ctorArgs[0], ctorArgs[1], ...);
}
問題:meta.newInstance()
Result をmeta.newInstance()
Argument
に渡す方法( からQObject*
に変換QGenericArgument
)?