Castle.Windsor - 如何实现TypedFactoryFacility

时间:2014-10-08 10:29:08

标签: dependency-injection castle-windsor factory-pattern typed-factory-facility

最近,我使用工厂模式开发了一个组件。但是,我做了一项研究。关于如何使用TypedFactoryFacility改进它,因为我们使用的是Castle.WIndsor。

您能提供一个简单的完整示例吗?我已经阅读了其中的一些,但仍然无法完全理解。到目前为止,我的代码看起来像这样:

public class DynamoStoreService : IDynamoStoreService 
{
    private IDynamoStoreFactory _dynamoStoreFactory;
    public DynamoStoreService(IDynamoStoreFactory dynamoStoreFactory)
    {
        _dynamoStoreFactory=dynamoStoreFactory;
    }

    public IDynamoStore GetProductDataDynamoStore(string storageAccount)
    {
        return _dynamoStoreFactory.Create(storageAccount);
    }
}

public class DynamoStoreFactory : IDynamoStoreFactory
{
    private IStorageAccountSelector _storageAccountSelector;

    public DynamoStoreFactory(IStorageAccountSelector storageAccountSelector)
    {
        _storageAccountSelector = storageAccountSelector;
    }

    public IDynamoStore Create(string storageAccount)
    {
        return new AzureKeyValueStore(_storageAccountSelector.GetCredentials(storageAccount).StorageAccount, "pointerfiles");
    }
}

public class StorageAccountSelector : IStorageAccountSelector
{
    private readonly IConfigurationSettings _settings;
    public StorageAccountSelector(IConfigurationSettings settings)
    {
        _settings = settings;
    }

    BlobCredentials IStorageAccountSelector.GetCredentials(string storageAccount)
    {
        return new BlobCredentials()
        {
            Container = string.Empty,
            StorageAccount = GetStorageAccount(storageAccount)
        };
    }

    private string GetStorageAccount(string storageAccount)
    {
        switch (storageAccount)
        {
            case "CustomerPolarisingCategoryBlobStorageAccountKey":
                return _settings.CustomerPolarisingCategoryBlobStorageAccount;
            case "CustomerPolarisingSegmentBlobStorageAccountKey":
                return _settings.CustomerPolarisingSegmentBlobStorageAccount;
            case "P2ProductSimilarityBlobStorageAccountKey":
                return _settings.P2ProductSimilarityBlobStorageAccount;
            case "ProductPolarisingCategoryBlobStorageAccountKey":
                return _settings.ProductPolarisingCategoryBlobStorageAccount;
            case "ProductPolarisingSegmentBlobStorageAccountKey":
                return _settings.ProductPolarisingSegmentBlobStorageAccount;
            case "SignalBlobStorageAccountKey":
                return _settings.SignalBlobStorageAccount;
        }
        return string.Empty;
    }
}

}

基本上,IDynamostore,当被调用时,我们需要能够传递不同的连接字符串。我已经找到了上面的设计..可以使用TypedFactoryFacility来改进吗?

由于

1 个答案:

答案 0 :(得分:0)

也许下面的代码可以让您了解如何使用TypedFactoryFacility。如果你已经研究过并对此有疑问,请告诉我。

亲切的问候, Marwijn。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using Castle.Facilities.TypedFactory;
using Castle.MicroKernel;
using Castle.MicroKernel.Registration;
using Castle.Windsor;

namespace ConsoleApplication3
{
    public class TypedFactoryComponentSelector : DefaultTypedFactoryComponentSelector
    {
        private readonly StorageAccountSelector _storageAccountSelector;

        public TypedFactoryComponentSelector(StorageAccountSelector storageAccountSelector)
        {
            _storageAccountSelector = storageAccountSelector;
        }

        protected override System.Collections.IDictionary GetArguments(MethodInfo method, object[] arguments)
        {
            var dictionary = new Dictionary<string, object>();

            dictionary.Add("mappedStorageAccount", _storageAccountSelector.GetCredentials((string)arguments[0]).StorageAccount);
            dictionary.Add("files", "pointerfiles");

            return dictionary;
        }
    }

    public interface IDynamoStore
    {
    }

    public class AzureKeyValueStore : IDynamoStore
    {
        public AzureKeyValueStore(string mappedStorageAccount, string files)
        {
            Console.WriteLine(mappedStorageAccount);
            Console.WriteLine(files);
        }
    }

    public class BlobCredentials
    {
        public string Container { get; set; }
        public string StorageAccount { get; set; }
    }


    public interface IDynamoStoreFactory
    {
        IDynamoStore Create(string storageAccount);
    }

    public class StorageAccountSelector
    {

        public BlobCredentials GetCredentials(string storageAccount)
        {
            return new BlobCredentials()
            {
                Container = string.Empty,
                StorageAccount = GetStorageAccount(storageAccount)
            };
        }

        public string GetStorageAccount(string storageAccount)
        {
            return storageAccount + "Mapped";
            return string.Empty;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var container = new WindsorContainer();
            container.AddFacility<TypedFactoryFacility>();

            container.Register(
                Component.For<IDynamoStoreFactory>().AsFactory(new TypedFactoryComponentSelector(new StorageAccountSelector())),
                Component.For<IDynamoStore>().ImplementedBy<AzureKeyValueStore>()
            );

            var factory = container.Resolve<IDynamoStoreFactory>();
            factory.Create("storageAccount");
        }
    }
}