как создать абстрактный класс со структурной картой - PullRequest
1 голос
/ 22 июня 2011

есть ли проблемы с такой регистрацией через структурную карту ??

 static public class ContainerBootstrapper
{
    static public void BootstrapDefaultContainer(bool test = false)
    {
      StructureMap.ObjectFactory.Initialize(x =>
         {
           x.Scan(p =>
             {
                 p.AssemblyContainingType<IPropertyType>();
                 p.AddAllTypesOf<IPropertyType>();
                 //                     p.AddAllTypesOf<IPropertyType>().NameBy(c => c.Name);
             });

        });
  }





 public interface IPropertyType : IIdentityObject, IPriority
{
    string PropertyName { get; set; }

    ObjectType ObjectType { get; }

    string DisplayName { get; set; }

    IEntityType EntityType { get; set; }

    IList<IPropertyRuleObject> RuleObjects { get; set; }

    void AddRuleObject(IPropertyRuleObject ruleObject);

}



 public abstract class PropertyTypeBase : PersistentObject, IPropertyType
{
    public PropertyTypeBase()
    {

    }

    public PropertyTypeBase(string propertyName, string displayName)
    {
        PropertyName = propertyName;
        DisplayName = displayName;
    }

   ....

 }



public class StringType : PropertyTypeBase
{
    private ObjectType _objectType;

    public StringType()
    {
        _objectType = new ObjectType(typeof(string));
    }

    public StringType(string propertyName, string displayName)
        : base()
    {
        PropertyName = propertyName;
        DisplayName = displayName;
    }

    public override ObjectType ObjectType
    {
        get { return _objectType; }
    }
}

когда ContainerBootstrapper.BootstrapDefaultContainer ();выполнить Я вижу эту строку ошибки:

StructureMap Exception Code:  200

Не удалось найти экземпляр с именем "StringType" для PluginType Azarakhsh.Domain.Core.AdaptiveObjectModel.Interface.IPropertyType

код вызова:

 public IPropertyType GetPropertyType(IIdentityObject identityObject, string name)
    {
        string[] Properties = name.Split('.');

        object Result = identityObject;

        foreach (var Property in Properties)
            Result = Result.GetType().GetProperty(Property).PropertyType.Name;

        IPropertyType propertyType = StructureMap.ObjectFactory.GetNamedInstance<IPropertyType>  (Result + "Type");
        if (propertyType==null)
            throw new Exception("Property type not found");

        return propertyType;
    }

в чем проблема?

1 Ответ

2 голосов
/ 27 июня 2011

Вы пытаетесь получить именованный экземпляр, но из того, что я вижу в коде, который вы предоставили, вы не называете свои экземпляры.Строка кода, которая называет ваши экземпляры, закомментирована.

Но даже если бы вы просто использовали ObjectFactory.GetInstance<IPropertyType>(); здесь, вы бы получили ошибку, потому что Structuremap не знает, какой конструктор использовать.Есть несколько решений этой проблемы.

  1. Измените свой дизайн, чтобы у вас был только один конструктор
  2. Пометьте ваш конструктор по умолчанию атрибутом [DefaultConstructor], тогда он будет работать.
  3. Вы можете зарегистрировать его в objectFactory вручную с помощью чего-то подобного:

    x.For (). Use (). Ctor ("propertyName"). Is ("someValue"). Ctor("displayName"). Is ("someValue");

  4. Вы можете написать пользовательское соглашение о регистрации, как описано здесь

...