Dependency injection 温莎城堡-如何实现TypedFactoryFacility

Dependency injection 温莎城堡-如何实现TypedFactoryFacility,dependency-injection,castle-windsor,factory-pattern,typed-factory-facility,Dependency Injection,Castle Windsor,Factory Pattern,Typed Factory Facility,最近,我使用factory模式开发了一个组件。然而,我做了一项研究。关于如何使用TypedFactoryFacility改进它,因为我们使用的是Castle.WIndsor 你能提供一个简单完整的例子吗?我读了一些,但仍然不能完全理解。到目前为止,我的代码如下所示: public class DynamoStoreService : IDynamoStoreService { private IDynamoStoreFactory _dynamoStoreFactory; pu

最近,我使用factory模式开发了一个组件。然而,我做了一项研究。关于如何使用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可以改进这一点吗


谢谢

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

亲切问候,, 马尔维


您希望使用TypedFactoryFacility实现什么。通常在需要解析不容易注入的类型时使用@IlyaPalkin是对的,你想实现什么?
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");
        }
    }
}