2

ASP.Net MvC 3 WebアプリでC#を使用して依存性注入にStructureMapを使用してきましたが、今日、作成したC#CustomResolverに必要なタイプを注入できません。

StructureMapInitialization.csファイルのコードは次のとおりです。

namespace UI.DependencyResolution
{
/// <summary>
/// Class Structure Map IOC intialization
/// </summary>
public static class StructureMapIocInitialization
{
    /// <summary>
    /// Initialize Method for Structure Map IOC Initialization
    /// </summary>
    /// <returns>an IContainer for Services and Repository</returns>
    public static IContainer Initialize()
    {
        ObjectFactory.Initialize(cfg =>
        {
            cfg.Scan(scan =>
            {
                scan.Assembly("Infrastructure");
                scan.Assembly("Core");
                scan.WithDefaultConventions();
                scan.ConnectImplementationsToTypesClosing(typeof(IAlertGenerator<>));
                scan.ConnectImplementationsToTypesClosing(typeof(IValidationRule<>));
            });

            cfg.For<IFilterProvider>().Use<StructureMapFilterProvider>();
            cfg.For<IControllerActivator>().Use<StructureMapControllerActivator>();

            cfg.SetAllProperties(c =>
            {
                c.WithAnyTypeFromNamespaceContainingType<ICustomerRepository>();
                c.WithAnyTypeFromNamespaceContainingType<IMachineRepository>();
                c.WithAnyTypeFromNamespaceContainingType<ICurrentUserService>();
                c.WithAnyTypeFromNamespaceContainingType<ICircuitRegistrationRepository>();
                c.WithAnyTypeFromNamespaceContainingType<IWorkflowRequestInformationRepository>();
                c.WithAnyTypeFromNamespaceContainingType<IEnumerable<IAlertGenerator<Customer>>>();

            });

        });

        return ObjectFactory.Container;
    }
}

}

AutoMapperProfile.csファイルのコードの抜粋は次のとおりです。

Mapper.CreateMap<AbstractOrganization, DashboardDetails>()
    .ForMember(dashboard => dashboard.AlertsDictionary,
    member => member.ResolveUsing<OrganizationAlertResolver>()
    .ConstructedBy(() => new OrganizationAlertResolver(
        ObjectFactory.GetInstance<ICustomerRepository>(), ObjectFactory.GetInstance<IEnumerable<IAlertGenerator<Customer>>>())));

そして、これが私のCustomResolverコードです:

namespace UI.Models.CustomResolvers
{
    public class OrganizationAlertResolver : ValueResolver<Organization, Dictionary<string,   string>>
    {
        private readonly ICustomerRepository _customerRepository;

        /// <summary>
        /// Storage for customer alert generator.
        /// </summary>
        private readonly IEnumerable<IAlertGenerator<Customer>> _customerAlertGenerators;


        public OrganizationAlertResolver(ICustomerRepository customerRepository, 
            IEnumerable<IAlertGenerator<Customer>> customerAlertGenerators)
        {
            _customerRepository = customerRepository;
            _customerAlertGenerators = customerAlertGenerators;
        }

        protected override Dictionary<string,string> ResolveCore(Organization organization)
        {
            var customers = _customerRepository.GetActiveCustomersByOrgNumber(organization.OrgNumber);
            foreach (var generator in _customerAlertGenerators)
            {
                generator.PopulateAlerts(customers);
            }

        Dictionary<string, string> alertsDictionary = new Dictionary<string, string>();

            foreach (var customer in customers)
            {
                foreach (var alert in customer.Alerts)
                {
                    if(alertsDictionary.ContainsKey(alert.ToString()))
                    {
                        alertsDictionary[alert.ToString()] = alert.Message;
                    }
                    else
                    {
                        alertsDictionary.Add(alert.ToString(), alert.Message);
                    }
                }
            }
            return alertsDictionary;
        }
    }
}

そのため、StructureMapを使用してCustomerタイプのIAlertGeneratorのIEnumerableをCustomResolverに挿入しようとしていますが、そのインスタンスを作成したにもかかわらず、そのタイプのデフォルトインスタンスが見つからなかったというStructureMap202例外が発生します。 StructureMap初期化ファイルの最後のエントリ。

これは、実行時に表示されるエラーメッセージのコピーです。

StructureMap例外コード:202PluginFamilyのデフォルトインスタンスが定義されていませんSystem.Collections.Generic.IEnumerable1 1[[Core.Domain.Alerts.IAlertGenerator[[Core.Domain.Model.Customer、Core、Version = 1.0.0.0、Culture = neutral、PublicKeyToken = null]]、Core、Version = 1.0.0.0、Culture = neutral、PublicKeyToken = null]]、mscorlib、Version = 4.0.0.0、Culture = neutral、PublicKeyToken = b77a5c561934e089

誰かがこの問題を解決する方法についての提案を手伝ってもらえますか?

4

2 に答える 2

2

Mikeが指摘したことに加えて、この問題は、複数のインスタンスが型を閉じることによって引き起こされる可能性があります。コードに基づく:

ObjectFactory.GetInstance<IEnumerable<IAlertGenerator<Customer>>>()

それが起こっていることだと思います。

上記を次のように変更するのと同じくらい簡単なはずです。

ObjectFactory.GetAllInstances<IAlertGenerator<Customer>>()

これは、閉じるすべてのインスタンスを検索しますIAlertGenerator<Customer>

于 2012-09-25T17:01:11.873 に答える
0

ここで何が起こっているのか100%確信はありませんが、このエラーが発生したときにStructureMapで2つの異なる問題が発生しました。1つ目は、インスタンス化されるクラスにはパラメーターのないコンストラクターが必要なため、コンストラクターCustomerがない場合があるということです。

2つ目は、パラメーターのないコンストラクターが存在する場合でも、StructureMapは最も完全に修飾されたコンストラクターを使用しようとすることです。これは、のようなクラスで見たことがありますSqlConnection。以下は、それを回避する方法の例です。

x.ForRequestedType<IDbConnection>()
    .CacheBy(InstanceScope.Singleton)
    .TheDefault.Is.ConstructedBy(ctor => new SqlConnection("connection string"));

.TheDefault.Is.ConstructedBy適切なコンストラクターを使用するには、コンストラクターを使用する必要があることに注意してください。これに頼る前に、私は構成を使用してパラメーターを渡そうとしましたが、.Ctorそれを機能させることができませんでした。

これがあなたを正しい方向に向けるのに役立つことを願っています。

于 2012-09-25T12:34:33.840 に答える