1

One of my class has 2 constructors:

public class Foo
{
    public Foo() { }

    public Foo(string bar) { }
}

When I am resolving this from unity, I get an exception because it looks for the string bar parameter. But I want the unity to instantiate this class using the constructor with no parameter. How can I achieve this?

I am using the LoadConfiguration method to register the types from the configuration file.

Unity Container Configuration:

container.LoadConfiguration("containerName");

Config File:

<unity xmlns="">
  <typeAliases>
    <typeAlias alias="string" type="System.String, mscorlib" />
    <typeAlias alias="singleton" type="Microsoft.Practices.Unity.ContainerControlledLifetimeManager, Microsoft.Practices.Unity" />
  </typeAliases>
  <containers>
    <container name="containerName">
      <types>
        <type type="IFoo, Assembly"
              mapTo="Foo, Assembly" />
        ...
      </types>
    </container>
  </containers>
</unity>

1 Answer 1

3
  • [InjectionConstructor] attribute over your constructor specifies which constructor should be used while resolving service

    public class Foo  : IFoo
    {
       [InjectionConstructor]
       public Foo() { }
    
       public Foo(string bar) { }
    }
    

this approach makes you class coupled to Unity, your class becomes less reusable (imagine that you need to use Foo in different scenario where you need to use another constructor) and this way is not recommended , read more about this here

  • Better way is to use API and register you class as follows

    container.RegisterType<IFoo>(new Foo());  
    

Here, you explicitly define how you want your dependency to be resolved.

  • Alternatively you can use Xml Config file, namely specify <contructor> element inside <register> element

Notice that we do not specify <params> child element inside <constructor> element

If no <param> child elements are present, it indicates that the zero-argument constructor should be called

See more about Xml schema here

Sign up to request clarification or add additional context in comments.

2 Comments

Thanks, I'll try the last one.
@Kael Glad if helped

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.