目前我正在尝试使用依赖注入容器,这次使用Unity.
给出以下界面:
public interface IPodcastCommService
{
void Download();
void Upload();
}
Run Code Online (Sandbox Code Playgroud)
以及以下实施:
public class PodcastService
{
private IPodcastCommService commservice;
private String url;
public PodcastService(String url, IPodcastCommService commservice)
{
this.commservice = commservice;
this.url = url;
}
}
Run Code Online (Sandbox Code Playgroud)
由于构造函数,我一直在寻找一个解决方案来将参数传递给它并找到它:
var p = container.Resolve<IPodcastCommService>(new ParameterOverride("url", myUrl));
Run Code Online (Sandbox Code Playgroud)
到目前为止一切都那么好,但与此同时我读到了这是多么糟糕,这个类的设计有多糟糕,是的,它看起来有点难看.但是如何以优雅的方式将参数传递给类?
我的第一个想法是将它作为一个属性来做,但是每次我需要它已经给出的Url时我必须检查.
更新: 一个例子,我读到这是一个糟糕的设计,是这样的:
但是在某些情况下,您可以为解析操作传递自定义构造函数参数.有些人可能会争辩说,这种糟糕的体系结构的尖叫声,但有一些情况,比如将DI容器带到遗留系统,可能需要这些操作.
资料来源:http://mikaelkoskinen.net/unity-passing-constructor-parameters-to-resolve/
我在ModelStateDictionary上有一个包装器,我的所有服务都接受它.是否可以配置autofac将控制器ModelStateDictionary注入包装器的构造函数,然后将其注入服务构造函数?
//code
public class ModelValidation : IModelValidation {
public ModelValidation(ModelStateDictionary msd){...}
..
..
}
public class CustomerService{
public CustomerService(IModelValidation mv){...}
..
}
Run Code Online (Sandbox Code Playgroud)
谢谢
在构造函数中使用类似字符串参数的东西会使依赖注入变得非常混乱.认为:
public class CurrencyActor
{
public CurrencyActor(string currency, IRepository repository)
{
...
Run Code Online (Sandbox Code Playgroud)
还有其他问题(例如这个)用依赖注入来解决这个特殊问题.通常,这可以通过重新思考设计和重构来解决.
但是,如果对象的多个版本分别负责不同的数据(例如每种货币的CurrencyActor)实际上有意义呢?这在使用像Akka .NET这样的actor模型时非常正常,但即使在该域之外也是有意义的.
在传递他们需要的初始状态时,使用依赖注入创建这些多个实例的最佳方法是什么?
我花了一些时间记录自己的依赖注入和IoC,但我还没有找到解决问题的方法.
我的问题涉及在使用依赖容器时对象的实例化,因为它创建了对构造函数的参数的依赖.在我遇到的几乎每个例子中,具体类的构造函数都没有任何参数.它使一切都变得"简单".因此我的问题在这里.
我们举一个例子:我需要从两个源A和B下载一些数据.源A包含各种格式的数据; 例如csv和xml.我们不需要为源B指定这样的东西.
这是一些代码(请注意我尽可能地简化代码来说明我的观点):
using System.Net;
using System.IO;
using System.Reflection;
namespace Question
{
class Program
{
static void Main(string[] args)
{
//exemple of code using Client A
DependencyContainer container1 = GetContainer1();
IClient client1 = container1.Resolve<IClient>("xml");
User user1 = new User(client1);
user1.run();
DependencyContainer container2 = GetContainer2();
IClient client2 = container2.Resolve<IClient>();
User user2 = new User(client2);
user2.run();
}
public static DependencyContainer GetContainer1()
{
DependencyContainer container = new DependencyContainer();
container.Register<IClient, ClientA>();
return container;
}
public static DependencyContainer GetContainer2()
{
DependencyContainer container = …Run Code Online (Sandbox Code Playgroud)