我最近在C#中将SOLID做到了非常极端的水平,并且在某些时候意识到我现在基本上没有做太多的事情.在我最近再次开始研究F#之后,我认为对于我现在正在做的很多事情,它可能是更合适的语言选择,所以我想尝试将一个真实的C#项目移植到F#作为概念的证明.我想我可以推出实际的代码(以一种非惯用的方式),但我无法想象一个架构会是什么样的,它允许我以与C#类似的灵活方式工作.
我的意思是我有很多小类和接口,我使用IoC容器编写,我也使用了像Decorator和Composite这样的模式.这导致(在我看来)非常灵活和可演化的整体架构,使我能够在应用程序的任何位置轻松替换或扩展功能.根据所需更改的大小,我可能只需要编写一个新的接口实现,在IoC注册中替换它并完成.即使更改更大,我也可以替换部分对象图,而应用程序的其余部分只是像以前一样.
现在使用F#,我没有类和接口(我知道我可以,但我认为这与我想要进行实际函数式编程的时间不同),我没有构造函数注入,而且我没有IoC容器.我知道我可以使用更高阶函数做类似Decorator模式的东西,但这似乎并没有给我带有构造函数注入的类的灵活性和可维护性.
考虑这些C#类型:
public class Dings
{
public string Lol { get; set; }
public string Rofl { get; set; }
}
public interface IGetStuff
{
IEnumerable<Dings> For(Guid id);
}
public class AsdFilteringGetStuff : IGetStuff
{
private readonly IGetStuff _innerGetStuff;
public AsdFilteringGetStuff(IGetStuff innerGetStuff)
{
this._innerGetStuff = innerGetStuff;
}
public IEnumerable<Dings> For(Guid id)
{
return this._innerGetStuff.For(id).Where(d => d.Lol == "asd");
}
}
public class GeneratingGetStuff : IGetStuff
{
public IEnumerable<Dings> For(Guid id)
{
IEnumerable<Dings> dingse;
// somehow knows how to …Run Code Online (Sandbox Code Playgroud) 看看Microsoft的Managed Extensibility Framework(MEF)和各种IoC容器(例如Unity),我没有看到何时使用一种类型的解决方案而不是另一种.更具体地说,似乎MEF处理大多数IoC类型模式,并且像Unity那样的IoC容器不是必需的.
理想情况下,我希望看到一个很好的用例,其中将使用IoC容器代替MEF或者除了MEF之外.
我IRespository在以下代码中注册了两次(带名字):
// Setup the Client Repository
IOC.Container.RegisterType<ClientEntities>(new InjectionConstructor());
IOC.Container.RegisterType<IRepository, GenericRepository>
("Client", new InjectionConstructor(typeof(ClientEntities)));
// Setup the Customer Repository
IOC.Container.RegisterType<CustomerEntities>(new InjectionConstructor());
IOC.Container.RegisterType<IRepository, GenericRepository>
("Customer", new InjectionConstructor(typeof(CustomerEntities)));
IOC.Container.RegisterType<IClientModel, ClientModel>();
IOC.Container.RegisterType<ICustomerModel, CustomerModel>();
Run Code Online (Sandbox Code Playgroud)
但是当我想要解决这个问题(使用IRepository)时,我必须像这样做一个手动解决方案:
public ClientModel(IUnityContainer container)
{
this.dataAccess = container.Resolve<IRepository>(Client);
.....
}
Run Code Online (Sandbox Code Playgroud)
我想要做的是在构造函数中解析它(就像IUnityContainer).我需要一些方法来说明要解析的命名类型.
这样的事情:( 注意:不是真正的代码)
public ClientModel([NamedDependancy("Client")] IRepository dataAccess)
{
this.dataAccess = dataAccess;
.....
}
Run Code Online (Sandbox Code Playgroud)
有没有办法让我的假代码工作?
是否可以IOptions<AppSettings>从ConfigureServicesStartup中的方法解析实例?通常,您可以使用IServiceProvider初始化实例,但在注册服务时此阶段没有实例.
public void ConfigureServices(IServiceCollection services)
{
services.Configure<AppSettings>(
configuration.GetConfigurationSection(nameof(AppSettings)));
// How can I resolve IOptions<AppSettings> here?
}
Run Code Online (Sandbox Code Playgroud) 我正在探索依赖注入,并且在整个地方使用术语组合根.那是什么?
从应用程序中的类中获取Autofac容器的建议方法是什么?Autofac是否提供解析类上的IContainer属性,还是我需要在构建容器后全局存储容器?
快进:
我写这篇文章的目的是为了更好地理解依赖注入和IoC容器,以及之后我可以纠正它中的错误并用它来帮助教我的一些朋友关于它们.
截至目前,我已经尝试阅读各种框架(laravel,fuel,codeigniter,symfony)的文档,我发现框架中有太多不同的方面,我需要感觉舒服使用它,我决定尝试在尝试在框架中使用它们之前,先单独学习每个主要部分.
我花了几个小时搜索各种含义,查看stackoverflow响应,阅读各种文章试图了解什么是IoC以及如何使用它来正确管理依赖关系,我相信我理解它在概念中是什么,但我仍然是灰色的关于如何正确实现它.我认为阅读本文的任何人帮助我的最好方法是给出我目前对IoC容器和依赖注入的理解,然后让那些比我更了解的人指出我的理解不足的地方.
我的理解:
所以在这一点上,我开始尝试使用IoC容器来处理更复杂的场景.到目前为止,为了使用IoC容器,我似乎只限于我想要创建的任何类的has-a关系,它具有它想要在IoC容器中定义的依赖项.如果我想创建一个继承类的类,但只有在以IoC容器中注册的特定方式创建父类时,该怎么办?
例如:我想创建一个mysqli的子类,但是我想在IoC容器中注册这个类,只是实例化我以前在IoC容器中注册的方式构造的父类.在没有重复代码的情况下,我无法想到这样做的方法(因为这是一个学习项目,我试图尽可能保持'纯').这里有一些我想要描述的例子.
以下是我的一些问题:
我知道这是非常漫长的,只是想提前感谢任何花时间阅读它的人,甚至更愿意分享他们的知识.
php oop inheritance dependency-injection inversion-of-control
MEF(Managed Extensibility Framework)解决了哪些问题,而现有的IoC/DI容器无法解决这些问题?
我正在修改我的软件,它有杂乱的Messenger.Default(...)位.
有没有任何备忘单知道MVVMLight SimpleIoc用法(不是一般的IoC描述)?
我在一个新的Web应用程序上使用NInject,有两件事我不清楚:
我是否需要保持对内核(Session/App变量)的引用以确保GC不收集我的所有实例?例如,如果我指定.Using()然后收集Kernel对象,那么我的所有"单身人士"都不是被收集的吗?
如果我确实需要保持对Kernel对象的引用,我如何允许传入WithArguments()的参数改变或者这是不可能的.
c# dependency-injection ninject ioc-container inversion-of-control
c# ×5
mef ×2
asp.net-core ×1
autofac ×1
composition ×1
f# ×1
inheritance ×1
mvvm-light ×1
ninject ×1
oop ×1
php ×1
wpf ×1