在过去的六,七个月中,我一直在对某些组件进行DI,因此它们变得越来越复杂。 过去,我一直使用手写的工厂来创建对象图。 由于它变得难以管理,因此我尝试将该代码移至依赖于框架的DI(通过代码而不是某些XML文件)。 我正在发布我的代码以及遇到的问题。

这是我的构图层(它很大,所以请耐心:)):

    IAgentFactory GetAgentFactory()
    {
        string errorMessage;
        IDictionary<AgentType, ServiceParameters> agentFactoryPrerequisite = new Dictionary<AgentType, ServiceParameters>();
        string restResponseHeaderStatus = MyConfigurationProject.GetConfigValue("RestResponseHeaderStatus", out errorMessage);


        var service1Parameters = new ServiceParameters();
        service1Parameters.BindingName = MyConfigurationProject.GetConfigValue("Service1WebHttpBindingConfiguration", out errorMessage).ToString();
        service1Parameters.HeaderPassword = MyConfigurationProject.GetConfigValue("Service1HeaderPassword", out errorMessage).ToString();
        service1Parameters.HeaderUserName = MyConfigurationProject.GetConfigValue("Service1HeaderUserName", out errorMessage).ToString();
        service1Parameters.ResponseHeaderStatus = restResponseHeaderStatus;
        service1Parameters.ServicePassword = MyConfigurationProject.GetConfigValue("Service1ServicePassword", out errorMessage).ToString();
        service1Parameters.ServiceUrl = MyConfigurationProject.GetConfigValue("Service1URL", out errorMessage).ToString();
        service1Parameters.ServiceUserName = MyConfigurationProject.GetConfigValue("Service1ServiceUserName", out errorMessage).ToString();
        agentFactoryPrerequisite.Add(new KeyValuePair<AgentType, ServiceParameters>(AgentType.Service1, service1Parameters));

        var agentFactory = new AgentFactory(agentFactoryPrerequisite);
        return agentFactory;
    }

    protected DatalayerSettings GetDataLayerSettings()
    {
        var datalayerSettings = new DatalayerSettings();
        datalayerSettings.ConnectionString = ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString;
        datalayerSettings.MySchemaName = ConfigurationManager.AppSettings["MyDatabaseSchema"];
        datalayerSettings.UpdatingUser = "Admin";
        return datalayerSettings;
    }



    PostgersDAFactory GetPostGresDaFactory()
    {
        var datalayerSettings = GetDataLayerSettings();
        return new PostgersDAFactory(datalayerSettings, "MyAssembly.PostgresDA", "MyDifferentAssembly.CommonDatalayer", "MyServiceLogPath");
    }



    public class PostgersDAFactory
    {
        readonly DatalayerSettings _datalayerSettings;
        readonly string _assemblyName;
        readonly string _logPath;
        readonly string _mySecondAssemblyName;
        public PostgersDAFactory(DatalayerSettings datalayerSettings, string assemblyName, string mySecondAssemblyName, string logPath)
        {
            _datalayerSettings = datalayerSettings;
            _assemblyName = assemblyName;
            _logPath = logPath;
            _commonDaAssemblyName = commonDaAssemblyName;
        }

        public IDA1 GetDA1Instance()
        {
            var type1 = Type.GetType("MyAssembly.PostgresDA.ClassRealisingImplementation_For_DA1," + _assemblyName);
            return (IDA1)Activator.CreateInstance(type1, _datalayerSettings, _logPath);
        }

        public IDA2 GetDA2Instance()
        {
            var type1 = Type.GetType("MyAssembly.PostgresDA.ClassRealisingImplementation_For_DA2," + _assemblyName);
            return (IDA2)Activator.CreateInstance(type1, _datalayerSettings);
        }

        public IDA3 GetDA3Instance()
        {
            var type1 = Type.GetType("MyAssembly2.ClassRealisingImplementation_For_DA3," + _commonDaAssemblyName);
            return (IDA3)Activator.CreateInstance(type1, _datalayerSettings);
        }

    }



    public BaseFileHandler GetFileHandler(FileProvider fileprovider, MockedServiceCalculator mockedServicecalculator = null)
    {
        string errorMessage;
        var postgresFactory = GetPostGresDaFactory();
        var Da1Instance = postgresFactory.GetDA1Instance();
        var fileSyncBusiness = new FileSyncBusiness(Da1Instance);
        var interfaceConfiguratonParameters = fileSyncBusiness.GetInterfaceConfigurationParameters();
        var servicePointDetailsSettings = new ServicePointDetailsSettings();
        var nullDate = new DateTime(2099, 1, 1);

        CommonValidations commonValidations;
        if (mockedServicecalculator == null)
        {
            commonValidations = GetStubbedCommonValidations(nullDate);
        }
        else
        {
            commonValidations = GetCommonValidations_WithMockedServiceCalculator(nullDate, mockedServicecalculator);
        }

        switch (fileprovider)
        {
            case FileProvider.Type1:
                var type1Adapter = new Type1Adaptor(false, nullDate);
                servicePointDetailsSettings = GetUtiltaParameters(interfaceConfiguratonParameters);
                return new Type1FileHandler(servicePointDetailsSettings, fileSyncBusiness, commonValidations, type1Adapter);

            case FileProvider.Type2:
                var type2Adapter = new Type2Adaptor(true, nullDate);
                servicePointDetailsSettings.ApplicableParameters = MyApplicationCommonMethods.ConvertConfigurationTableToDictonary(interfaceConfiguratonParameters, "applicableintype2");
                servicePointDetailsSettings.BadFileLocation = MyConfigurationProject.GetConfigValue("Type2BadFileLocation", out errorMessage);
                servicePointDetailsSettings.DateFormat = MyConfigurationProject.GetConfigValue("Type2DateFormat", out errorMessage);
                servicePointDetailsSettings.FailureFileLocation = MyConfigurationProject.GetConfigValue("Type2FailureFile", out errorMessage);

                servicePointDetailsSettings.LogFileName = "Type2LogFile";
                servicePointDetailsSettings.LogPath = MyConfigurationProject.GetConfigValue("Type2ErrorLog", out errorMessage);
                servicePointDetailsSettings.MandatoryParameters = MyApplicationCommonMethods.GetDictonaryForMandatoryParameters(interfaceConfiguratonParameters, "applicableintype2", "mandatoryintype2");
                servicePointDetailsSettings.SourceFileLocation = MyConfigurationProject.GetConfigValue("type2FileLocation", out errorMessage);
                servicePointDetailsSettings.SuccessFileLocation = MyConfigurationProject.GetConfigValue("type2SuccessFile", out errorMessage);
                servicePointDetailsSettings.TargetFileExtension = MyConfigurationProject.GetConfigValue("type2SupportedFileType", out errorMessage);
                servicePointDetailsSettings.Type2RecordTag = MyConfigurationProject.GetConfigValue("MyApplicationtype2RecordTag", out errorMessage);

                return new Type2FileHandler(servicePointDetailsSettings, fileSyncBusiness, commonValidations, type2Adapter);
            default:
                throw new NotImplementedException("FileProvider type: " + Convert.ToInt32(fileprovider) + " is not implemented");
        }
    }
    }

在迈向温莎的过程中,我遇到了几个问题,因为我从未使用过该产品,所以它看起来非常复杂。

问题:

  1. 具有参数化构造函数的参数如何传递给对象?
  2. 我知道有一种更好的方式编写“ PostgersDAFactory”类,但是根本不知道。
  3. 有一些Factory方法,例如GetAgentFactory(),它们依赖于其他项目的某些静态方法,这些方法又为我提供了配置值(我将其存储在数据库中),另一种方法GetDataLayerSettings也依赖于应用程序配置作为一些静态字符串。
  4. 我可能会在类中更改参数名称以提高可读性,那么如何打开Windsor的日志记录?
  5. 最后,另一个复杂的方法GetFileHandler,具有一些逻辑(切换情况)。

我曾尝试在该网站上访问,但发现信息完全难以消化,API很大,学习曲线似乎很猛。

注意:由于安全原因,我不得不更改变量名称。

  ask by shankbond translate from so

本文未有回复,本站智能推荐:

1回复

Castle Windsor:实现2级(嵌套)工厂的更好方法?

我们有一个我们多次使用的模式,我们在不同的Dll中实现处理程序和工厂。 我们在运行时配置exe,说明加载了哪些dll,以及应用程序可以使用哪些处理程序。 我们这样做是因为我们为一些客户提供了自定义处理,同时它还具有很大的灵活性,因为我们可以快速开发新的处理程序,并且可以放心地测试和部署它
1回复

构造函数DI的自动工厂生成器

我想在不传递任何“内核”容器的情况下使用基于工厂的依赖项注入,以便在没有从“顶部”显式传递其依赖项的情况下无法实例化一个类。 手动方法需要在引导程序中输入以下代码: 当工厂定义为 有什么我可以用来简化工厂建造甚至自动完成的工厂? 具有不同的工厂类型支持(池,ThreadL
1回复

Castle.Windsor-如何实现TypedFactoryFacility

最近,我使用工厂模式开发了一个component。 但是,我做了研究。 关于如何使用TypedFactoryFacility进行改进,因为我们使用的是Castle.WIndsor。 您能否提供一个简单的完整示例? 我读的很少,但仍然不能完全理解。 到目前为止,我的代码看起来像这样:
1回复

如何解决Castle Windsor Factory的依赖?

我读到了CastleWindsor的工厂,但我无法理解。 希望有人能帮助我。 我在MVC4项目中有这个类型的工厂。 这是这样注册的: 如果在MVC控制器内部我以这种方式调用工厂。 我得到了正确的一个,名为“TakeAway”。 但为此我必须先知道类型。 换句话说,
2回复

温莎型工厂,开放式通用接口

在我的应用程序中,我想依赖于一个类中的多个存储库,而并非每次都需要所有存储库。 我没有在不必要的地方构造每个实例的实例,而是使用温莎的Typed Factory工具 。 但是,为每个存储库注册工厂有点累,我想用开放的通用注册代替。 我想要做的是如下所示: 但是,这是语法错误,因
2回复

使用Castle Windsor创建对象而不是工厂类

好的,所以我有一个基本类型: 然后我有一些产品: 然后是工厂类: 我知道温莎可以做到这一点,我知道这是一件好事。 据我所知,productBase将需要是一个接口,产品将实现该接口,但是然后我需要通过windsor中的枚举开关来使它们成为接口吗? 帮助和指针(
2回复

Log4Net与温莎城堡

我正在为应用程序配置日志记录,并为日志记录使用DI的log4net和castle windsor 。 我希望日志记录框架包装在自定义实现中,以便将来可以更改。 要使用DI注册此自定义实现... 当我要求DI解决记录器时,问题就来了,那么它总是返回Customlogger类型
1回复

在Castle.Windsor中注册和解析命名实例

我似乎无法将正确的实例注入到类ctor中。 这是我想要做的: 谁能发现问题?
1回复

使用温莎城堡时如何注入属性

我是IOC的新手。 我有MethodProfilerAspectAttribute属性,必须将其应用于任何此类方法 这是MethodProfilerAspectAttribute的实现 我想使用已注册的Log4NetLogger解决我的ILogger依赖关系,并使用以下方法
1回复

温莎城堡:注册具有多个项目的仿制药

我有一个这样定义的通用接口- 该接口由类似这样的类实现- 我尝试了以下方法来向Castle注册此接口和实现- 但是它在编译时失败,说“参数数目不正确”。