Tag: factory pattern

团结的抽象工厂

我有一个简单的抽象工厂实现: public abstract class ICarFactory{ public abstract ISportsCar CreateSportCar(); public abstract IFamilyCar CreateFamilyCar(); } public abstract class ISportsCar { public abstract void Accelerate(); } public abstract class IFamilyCar { public abstract void Accelarete(); } public class BMWFactory : ICarFactory { public override ISportsCar CreateSportCar() { return new BMWi7(); } public override IFamilyCar CreateFamilyCar() { return […]

虚拟调用与类型检查的另一个示例

问题 我发誓,每当我把它砸到我的脑中,我应该使用虚拟调用和类型检查(例如: if (obj is Foo) … else if (obj is Bar) … ……我想出了另一个我不知道如何实现前者的例子。 我正在通过串口实现分组化协议。 一些伪代码会解释这个: OnDataReceived: RcvPacket p = RcvPacket.ReadPacket(comport); // Call factory method if (p is RcvPacketFoo) OnFoo(); if (p is RcvPacketBar) OnBar(); OnFoo: raise Foo event OnBar: raise Bar event 基本上,ReadPacket是基类中的工厂方法 ,用于确定接收的数据包类型,并将缓冲区传递给正确的派生类型构造函数。 在此之后,我需要根据数据包的类型引发事件。 如何在不使用is运算符的情况下执行此操作? 我的方法听起来健全吗? 解 访客模式 ,当然! 谢谢Pablo Romeo 。 在这种情况下,我使控制器,即调用工厂方法,是访问者。 […]

C#:抽象策略基类,用作Strategy对象的抽象工厂

我正在尝试为我的公司创建一个基于Web的工具,实质上,它使用地理输入来生成表格结果。 目前,三个不同的业务领域使用我的工具并接收三种不同的输出。 幸运的是,所有输出都基于主表 – 子表的相同概念,甚至它们共享一个共同的主表。 不幸的是,在每种情况下,子表的相关行包含非常不同的数据。 因为这是唯一的争用点,我将FetchChildData方法提取到一个名为DetailFinder的单独类中。 结果,我的代码看起来像这样: DetailFinder DetailHandler; if (ReportType == “Planning”) DetailHandler = new PlanningFinder(); else if (ReportType == “Operations”) DetailHandler = new OperationsFinder(); else if (ReportType == “Maintenance”) DetailHandler = new MaintenanceFinder(); DataTable ChildTable = DetailHandler.FetchChildData(Master); PlanningFinder,OperationsFinder和MaintenanceFinder都是DetailFinder的子类。 我刚被要求增加对另一个业务领域的支持,并且if阻止趋势, if不愿继续这样做。 我更喜欢的是有一个看起来像这样的解析方法: DetailFinder DetailHandler = DetailFinder.Parse(ReportType); 但是,我DetailFinder知道如何让DetailFinder知道哪个子类处理每个字符串,甚至是什么子类存在而不仅仅将if块移动到Parse方法。 有没有办法让子类用抽象的DetailFinder注册自己?

使用Ninject的参数化工厂

如何使Ninject在运行时基于变量实例化对象? 我试图在控制器动作中注入正确的存储库 – MVC 3 – 基于来自用户输入的参数。 如果用户输入“BMW”,它会将ICarRepository绑定到BMWRepository ,如果输入“KIA”,则会注入KiaRepository 。 [HttpPost] public ActionResult SearchResult(FormCollection values) { string carModel = values[“model”]; ICarRepository myRepository = RepositoryFactory.getRepository(carModel); ….. } 这是通过switch / case noob instantiation或Parameterized Factories已知的,我知道如何在没有Ninject的情况下手动完成,请查看此处介绍的4种方法探索工厂模式 我的问题是如何用Ninject做到这一点?

如何实现通用的RepositoryFactory?

我正在尝试实现一个通用存储库。 这是我到目前为止所得到的…… public interface IRepositoryFactory { IRepository RepositoryOf() where T : class; } public class EntityFrameworkRepositoryFactory : IRepositoryFactory { private readonly IWindsorContainer _container; public EntityFrameworkRepositoryFactory(IWindsorContainer container) { _container = container; } public IRepository RepositoryOf() where T : class { var repository = _container.Resolve<IRepository>(); return repository; } } RepositoryFactory由我的工作单元实现使用 public interface IUnitOfWork : IDisposable { IRepository […]

带有Managed Ext Framework(MEF)的工厂模式

我正在尝试用MEF实现Factory Pattern。 这是我的解决方案 核心项目 IClass ObjectFactory static Class(This is where the problem is) 项目A. [Export(typeof(IClass))] [ExportMetadata(“Type”, “TypeA”)] public classA : IClass {} 项目B [Export(typeof(IClass))] [ExportMetadata(“Type”, “TypeB”)] public classB : IClass {} 我在尝试动态创建对象时遇到问题 这是工厂类: public static class ObjectFactory { private static readonly CompositionContainer _container; [ImportMany] public static IEnumerable<Lazy> objectTypes; static ObjectFactory() { AggregateCatalog catalog = new […]

我可以使用属性,以便我的工厂知道它可以/应该实例化而不破坏“松散耦合”规则吗?

我在我的项目中实现了一个工厂,最近建议我在我的类上使用属性,以便工厂可以确定要实例化和传回的类。 我是开发世界的新手,并试图严格遵循松散耦合的规则,我想知道依赖“钩子”(作为属性)是否违背了这一点?

使用命令和工厂设计模式执行排队作业

我有一个在数据库中排队的作业列表,我需要从数据库中读取并使用线程并行执行它们,我有一个命令类列表来执行每个实现公共接口(命令模式)的作业。 但是当我从数据库中检索挂起的作业时,我需要为每个作业实例化正确的命令对象(在工厂类中) ICommand command; switch (jobCode) { case “A”: command = new CommandA(); break; case “B”: command = new CommandB(); break; case “C”: command = new CommandC(); break; } command.Execute(); 有没有更好的方法来创建正确的命令对象而不使用上面的大开关语句? 或者是否有其他模式来执行排队的作业? 解决方案:这样解决(基于选定的答案)。 这将执行命令对象的延迟实例化。 public class CommandFactory { private readonly IDictionary<string, Func> _commands; public CommandFactory() { _commands = new Dictionary<string, Func> { {“A”, () => […]

在ASP.NET中使用dependency injection和工厂模式传递服务

我正在使用ASP.NET Core,我知道框架已经提供了这样的Logging机制,但是使用它来说明我的问题。 我正在使用一种Factory模式来构建Logger类,因为我不知道日志记录的类型(因为它存储在DB中)。 ILogger合同 Log(string msg) 然后,在根据从DB传递的参数创建Logger之后,LoggerFactory将返回ILogger: public class LoggerFactory { public static Contracts.ILogger BuildLogger(LogType type) { return GetLogger(type); } //other code is omitted, GetLogger will return an implementation of the related logger 现在,当我需要使用Logger时,我必须这样做: public class MyService { private ILogger _logger public MyService() { _logger = LoggerFactory.BuildLogger(“myType”); } 但是,我打算在没有任何实例化的情况下保留我的类,我需要在MyService中使用Constructor DI,我需要在Startup上注入所有依赖项: services.AddTransient (); 但这不起作用,我们需要通过一个具体的实现。 如何使用DI来完成这项工作,是否有更好的方法来实现它?

返回共享方法的两种不同类型的可能对象之一

我有2个class: public class Articles { private string name; public Articles(string name) { this.name = name; } public void Output() { Console.WriteLine(“The class is: ” + this.GetType()); Console.WriteLine(“The name is: ” + name); } } 和 public class Questionnaire { private string name; public Questionnaire(string name) { this.name = name; } public void Output() { Console.WriteLine(“The […]