Introduce proper HandlerFactory and reduce dependencies of RequestWorker

Bu işleme şunda yer alıyor:
Albert S. 2019-09-29 20:57:46 +02:00
ebeveyn 0ccc20454b
işleme 8364ace683
5 değiştirilmiş dosya ile 46 ekleme ve 55 silme

Dosyayı Görüntüle

@ -18,6 +18,7 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE. SOFTWARE.
*/ */
#include "handlerfactory.h" #include "handlerfactory.h"
#include "handler.h" #include "handler.h"
#include "handlerdefault.h" #include "handlerdefault.h"
@ -31,75 +32,49 @@ SOFTWARE.
#include "handlercategory.h" #include "handlercategory.h"
#include "handlerhistory.h" #include "handlerhistory.h"
#include "handlerpagedelete.h" #include "handlerpagedelete.h"
class Factory
std::unique_ptr<Handler> HandlerFactory::createHandler(const std::string &action, Session &userSession)
{ {
Template &templ;
Database &db;
Session &userSession;
UrlProvider &urlProvider;
ICache &cache;
HandlerConfig &handlerConfig;
public:
Factory(HandlerConfig &handlerConfig, Template &templ, Database &db, Session &usersession, UrlProvider &urlprovider,
ICache &cache)
: handlerConfig(handlerConfig), templ(templ), db(db), userSession(usersession), urlProvider(urlprovider),
cache(cache)
{
}
template <class T> inline std::unique_ptr<T> produce()
{
return std::make_unique<T>(handlerConfig, templ, db, userSession, urlProvider, cache);
}
};
std::unique_ptr<Handler> createHandler(const std::string &action, HandlerConfig &handlerConfig, Template &templ,
Database &db, Session &usersession, UrlProvider &urlprovider, ICache &cache)
{
Factory producer(handlerConfig, templ, db, usersession, urlprovider, cache);
if(action == "" || action == "index") if(action == "" || action == "index")
{ {
return producer.produce<HandlerDefault>(); return produce<HandlerDefault>(userSession);
} }
if(action == "show") if(action == "show")
{ {
return producer.produce<HandlerPageView>(); return produce<HandlerPageView>(userSession);
} }
if(action == "edit") if(action == "edit")
{ {
return producer.produce<HandlerPageEdit>(); return produce<HandlerPageEdit>(userSession);
} }
if(action == "login") if(action == "login")
{ {
return producer.produce<HandlerLogin>(); return produce<HandlerLogin>(userSession);
} }
if(action == "search") if(action == "search")
{ {
return producer.produce<HandlerSearch>(); return produce<HandlerSearch>(userSession);
} }
if(action == "delete") if(action == "delete")
{ {
return producer.produce<HandlerPageDelete>(); return produce<HandlerPageDelete>(userSession);
} }
if(action == "allpages") if(action == "allpages")
{ {
return producer.produce<HandlerAllPages>(); return produce<HandlerAllPages>(userSession);
} }
if(action == "allcategories") if(action == "allcategories")
{ {
return producer.produce<HandlerAllCategories>(); return produce<HandlerAllCategories>(userSession);
} }
if(action == "showcat") if(action == "showcat")
{ {
return producer.produce<HandlerCategory>(); return produce<HandlerCategory>(userSession);
} }
if(action == "recent") if(action == "recent")
{ {
return producer.produce<HandlerHistory>(); return produce<HandlerHistory>(userSession);
} }
return producer.produce<HandlerInvalidAction>(); return produce<HandlerInvalidAction>(userSession);
} }

Dosyayı Görüntüle

@ -3,7 +3,25 @@
#include <memory> #include <memory>
#include "handler.h" #include "handler.h"
#include "../template.h" #include "../template.h"
class HandlerFactory
{
HandlerConfig &handlerConfig;
Template &templ;
Database &db;
UrlProvider &urlProvider;
ICache &cache;
template <class T> inline std::unique_ptr<T> produce(Session &userSession)
{
return std::make_unique<T>(handlerConfig, templ, db, userSession, urlProvider, cache);
}
public:
HandlerFactory(HandlerConfig &handlerConfig, Template &templ, Database &db, UrlProvider &urlprovider, ICache &cache)
: handlerConfig(handlerConfig), templ(templ), db(db), urlProvider(urlprovider), cache(cache)
{
}
std::unique_ptr<Handler> createHandler(const std::string &action, Session &userSession);
};
std::unique_ptr<Handler> createHandler(const std::string &action, HandlerConfig &handlerConfig, Template &templ,
Database &db, Session &usersession, UrlProvider &urlprovider, ICache &cache);
#endif // HANDLERFACTORY_H #endif // HANDLERFACTORY_H

Dosyayı Görüntüle

@ -131,11 +131,13 @@ int main(int argc, char **argv)
User::setAnon(anon.value()); User::setAnon(anon.value());
Template siteTemplate{config.templateprefix, config.templatepath, config.urls, config.configVarResolver}; Template siteTemplate{config.templateprefix, config.templatepath, config.urls, config.configVarResolver};
UrlProvider urlprovider{config.urls}; UrlProvider urlProvider{config.urls};
auto cache = createCache(config.configVarResolver); auto cache = createCache(config.configVarResolver);
cache->clear(); cache->clear();
RequestWorker requestWorker(config.handlersConfig, *database, siteTemplate, urlprovider, *cache);
HandlerFactory handlerFactory{config.handlersConfig, siteTemplate, *database.get(), urlProvider, *cache.get()};
RequestWorker requestWorker{handlerFactory, *database->createSessionDao().get(), siteTemplate};
auto interface = createGateway(config); auto interface = createGateway(config);

Dosyayı Görüntüle

@ -66,9 +66,7 @@ Response RequestWorker::processRequest(const Request &r)
} }
} }
auto handler = createHandler(r.param("action"), *this->handlerConfig, *this->templ, *this->db, session, auto handler = handlerFactory->createHandler(r.param("action"), session);
*this->urlProvider, *this->cache);
try try
{ {
Response response = handler->handle(r); Response response = handler->handle(r);

Dosyayı Görüntüle

@ -9,27 +9,25 @@
#include "urlprovider.h" #include "urlprovider.h"
#include "database/sessiondao.h" #include "database/sessiondao.h"
#include "cache/fscache.h" #include "cache/fscache.h"
#include "handlers/handlerfactory.h"
class RequestWorker class RequestWorker
{ {
Database *db;
Template *templ; Template *templ;
UrlProvider *urlProvider; UrlProvider *urlProvider;
ICache *cache; ICache *cache;
HandlerConfig *handlerConfig; HandlerFactory *handlerFactory;
std::unique_ptr<SessionDao> sessionDao; SessionDao *sessionDao;
private: private:
Session retrieveSession(std::string token) const; Session retrieveSession(std::string token) const;
public: public:
RequestWorker(HandlerConfig &handlerConfig, Database &db, Template &templ, UrlProvider &provider, ICache &cache) RequestWorker(HandlerFactory &handlerFactory, SessionDao &sessionDao, Template &templ)
{ {
this->handlerConfig = &handlerConfig; this->handlerFactory = &handlerFactory;
this->db = &db;
this->templ = &templ; this->templ = &templ;
this->urlProvider = &provider; this->sessionDao = &sessionDao;
this->sessionDao = db.createSessionDao();
this->cache = &cache;
} }
Response processRequest(const Request &r); Response processRequest(const Request &r);