我正在尝试实现Generic Repository.这是我到目前为止所得到的......
public interface IRepositoryFactory
{
IRepository<T> RepositoryOf<T>() where T : class;
}
public class EntityFrameworkRepositoryFactory : IRepositoryFactory
{
private readonly IWindsorContainer _container;
public EntityFrameworkRepositoryFactory(IWindsorContainer container)
{
_container = container;
}
public IRepository<T> RepositoryOf<T>() where T : class
{
var repository = _container.Resolve<IRepository<T>>();
return repository;
}
}
Run Code Online (Sandbox Code Playgroud)
RepositoryFactory由我的工作单元实现使用
public interface IUnitOfWork : IDisposable
{
IRepository<T> RepositoryOf<T>() where T : class;
void Commit();
}
Run Code Online (Sandbox Code Playgroud)
无论如何,我想问的问题是,RepositoryFactory实现依赖于IWindsorContainer是否正确?
我需要一种方法来询问任何类型的IRepository,所以我的安装程序代码执行此操作...
// Windsor Container
container.Register(
Component.For<IWindsorContainer>()
.Named("Container")
.Instance(container)
);
Run Code Online (Sandbox Code Playgroud)
这似乎与IoC的整个概念背道而驰,但随后可能要求存储库的整个想法无论如何都会这样做.
编辑(回复miensol的回答)
我已经使用Windsor在我的安装程序中使用以下代码为我创建存储库...
// Generic …Run Code Online (Sandbox Code Playgroud) c# design-patterns repository-pattern factory-pattern entity-framework-4
现在我有一个叫A的班级.
我有一些像这样的代码..
from my.package.location.A import A
...
foo = A.doSomething(bar)
Run Code Online (Sandbox Code Playgroud)
这很棒.
但是现在我有一个名为A的新版A,但是在另一个包中,但我只想在某个场景中使用其他A. 所以我可以这样做:
if(OldVersion):
from my.package.location.A import A
else:
from new.package.location.A import A
...
foo = A.doSomething(bar)
Run Code Online (Sandbox Code Playgroud)
这很好用.但它很难看.我怎么能做得更好?我真的想做这样的事情
from my.abstraction.layer.AFactory import AFactory
...
myA = AFactory.giveMeA() # this looks at "OldVersion" and gives me the correct A
foo = myA.doSomething(bar)
Run Code Online (Sandbox Code Playgroud)
有没有办法让我更轻松?没有工厂层?现在,这可以将我的类上的每个静态方法调用转换为2行.我总是可以在类中保留一个引用以减少影响,但我真的希望python有一个更简单的解决方案.
我们如何在不使用框架的情况下应用依赖注入,当我们有两个层次结构非常深的UIViewController并且它们都需要相同的依赖关系来保存状态时,那两个UIViewControllers它们没有共同的父代.
例:
VC1 - > VC2 - > VC3 - > VC4
VC5 - > VC6 - > VC7 - > VC8
让我们看看他们都需要VC4和VC8 UserService来保存当前用户.
请注意,我们要避免使用Singleton.
是否有一种优雅的方式来处理这种DI情况?
经过一番研究,我发现,有些提Abstract Factory,Context interfaces,Builder,strategy pattern
但我找不到如何在iOS上应用它的示例
dependency-injection inversion-of-control factory-pattern ios swift
我将尝试缩短此代码示例:
public interface IThing
{
//... Stuff
}
public class Thing1 : IThing
{
}
public class Thing2 : IThing
{
}
public interface IThingView<out T>
{
ICollection<T> ViewAll();
}
public class ThingView<T> : IThingView<T>
{
ICollection<T> ViewAll() { return new List<T>(); } // There's a big operation here
}
public interface IThingViewerFactory
{
public IThingView<IThing> Build(string Which);
}
public class ThingViewerFactory
{
public IThingView<IThing> Build(string Which)
{
if(Which.Equals("Thing1") { return new (IThingView<IThing>)new ThingViewer<Thing1>();}
else { return new (IThingView<IThing>)new ThingViewer<Thing2>();} …Run Code Online (Sandbox Code Playgroud) 在大多数工厂模式实现中,该getInstance方法通常声明为static.工厂模式的主要优点是隐藏实现细节,但为什么getInstance()方法需要是静态的?实例化一个新的工厂对象是一个坏习惯吗?
XYZFactory factory = new XYZFactory();
XYZObj obj = factory.getInstance(TYPE);
Run Code Online (Sandbox Code Playgroud)
VS
XYZObj obj = XYZFactory.getInstance(TYPE);
Run Code Online (Sandbox Code Playgroud) 据我所知,工厂方法是简单工厂,工厂对象是抽象工厂?和:
- 工厂方法(简单工厂):
public class SimplePizzaFactory {
public static final int CHEESE = 1;
public static final int PEPPERONI = 2;
public static final int VEGGIE = 3;
public static Pizza createPizza(int type) {
Pizza pizza = null;
if (type == CHEESE) {
pizza = new CheesePizza();
} else if (type == PEPPERONI ) {
pizza = new PepperoniPizza();
} else if (type == VEGGIE ) {
pizza = new VeggiePizza();
}
return pizza;
}
}
Run Code Online (Sandbox Code Playgroud)
工厂对象(抽象工厂):
?
我对吗?
工厂模式的实现有多少,它们的区别是什么?
在我的Module.php我有我不想移动他们的方法,factory class以便我不会混淆Module class:
public function getControllerConfig()
{
return array(
'factories' => array(
'account-index' => function ($controllerManager) {
$serviceManager = $controllerManager->getServiceLocator();
$accountService = $serviceManager->get('account-service');
return new Controller\IndexController($accountService);
}
)
);
}
public function getServiceConfig()
{
return array(
'factories' => array(
'account-service' => function ($serviceManages) {
return new Service\Account;
}
)
);
}
Run Code Online (Sandbox Code Playgroud)
现在我有:
我把它放在哪里factory class,也许放在一个Factory文件夹里?
有任何想法吗?
我正在制作一个可以发送电子邮件或短信的信使,并且可以立即发送或稍后发送(信息保存在数据库中).我已经做了两个解决方案,但两个都不令我满意.
我正在将代码集中在一个Factory中,而Factory模式的代码非常简单:
class MessageFactory
{
static public function get($type,$em)
{
$instance = null;
switch ($type) {
case 'email':
$instance = new EmailMessage($em);
break;
....
return $instance;
}
class EmailMessage implements MessangerInterface
{
...
public function send( $eMessage,array $receivers, $time=NULL)
{
interface MessangerInterface
{
public function send($message,array $receivers);
}
Run Code Online (Sandbox Code Playgroud)
第一个解决方案:只需调用普通的静态方法
$messanger = Factory\MessageFactory::get('email',$em);
$messanger->send($eMessage, array('tom'=>'tom@gmail.com'));
Run Code Online (Sandbox Code Playgroud)
这是一个糟糕的解决方案,因为我需要将Doctrine Manager作为参数传递给方法
第二种解决方案:将其用作Symfony 2服务
services:
my.messanger:
class: Bundle\Factory\MessangerInterface
factory_class: Bundle\Factory\MessageFactory
factory_method: get
arguments:
messanger_type: %messanger.type%
Run Code Online (Sandbox Code Playgroud)
并且还将学说作为论据传递.但是使用这样的解决方案我不能在我的代码中选择messanger.type,它使用配置参数定义为email或sms; 我需要在代码中具有选择类型的能力.
另外我有一个问题,我需要在课堂上发送电子邮件或短信,这意味着我需要一个外部服务,得到这样的:
class EmailMessage …Run Code Online (Sandbox Code Playgroud) 我知道工厂方法是一个类方法,它利用self关键字并实例化它自己的类的对象.我不明白这是如何有用的,或者它如何扩展initialize方法的功能.
我正在创建一个创建命令行地址簿的项目,要求我在Person类上使用工厂模式,这样我就可以创建具有不同属性的Trainee或Instructor(子类).
最近我一直在尝试更好地理解在 C++ 中使用工厂模式。
我查阅了以下资源:
https://www.geeksforgeeks.org/design-patterns-set-2-factory-method/
https://sourcemaking.com/design_patterns/factory_method/cpp/1
https://www.codeproject.com/Articles/363338/Factory-Pattern-in-Cplusplus
https://www.bogotobogo.com/DesignPatterns/factorymethod.php
https://gist.github.com/pazdera/1099562
https://en.wikibooks.org/wiki/C%2B%2B_Programming/Code/Design_Patterns
在有人将其标记为“不是问题”之前,我确实有一些明确的问题,我稍后会讨论。但为了首先澄清我到目前为止的理解,我想从一个例子开始。这是我从上述链接中的信息中得到的最好的例子(最好的含义说明了工厂模式,但尽可能简单,因此该模式的初学者可以清楚地看到所涉及的问题):
// FactoryPattern.cpp
#include <iostream>
#include <vector>
enum AnimalSpecies { dog, cat };
class Animal
{
public:
virtual void makeSound() = 0;
};
class Dog : public Animal
{
public:
void makeSound() { std::cout << "woof" << "\n\n"; }
};
class Cat : public Animal
{
public:
void makeSound() { std::cout << "meow" << "\n\n"; }
};
class AnimalFactory
{
public:
static Animal* makeAnimal(AnimalSpecies animalSpecies);
};
Animal* AnimalFactory::makeAnimal(AnimalSpecies animalSpecies) …Run Code Online (Sandbox Code Playgroud)