将手写DI转换为Windsor提供的DI

时间:2014-04-20 15:55:36

标签: c#-4.0 dependency-injection castle-windsor factory factory-pattern

在过去的六七个月里,我一直在我的一些组件中进行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. 有一些工厂方法,如GetAgentFactory(),它们都是 依赖于其他项目的某些静态方法,而这又取决于 给我配置值(我将它们存储在数据库中), 另一种方法GetDataLayerSettings依赖于app config 以及一些静态字符串。
  4. 我可能会更改我的类中的参数名称 提高可读性,那么如何开启Windsor的日志记录?
  5. 最后另一个复杂的方法GetFileHandler,有一些逻辑 (开关盒)。
  6. 我试过去网站,但我发现消化信息非常困难,API很大,学习曲线似乎很猛。

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

0 个答案:

没有答案