I'm a Unity noob, and I have a question. I want to inject an IAgeCalculator into each instance of IPerson so that the IAgeCalculator instance is available to any IPerson that I might later create.
Here is what I have tried so far. It works, but it does not feel right.
static void Main(string[] args)
{
IUnityContainer container = new UnityContainer();
container.RegisterType<IAgeCalculator, AgeInYearsCalculator>("Years");
container.RegisterType<IAgeCalculator, AgeInDaysCalculator>("Days");
// Using the initializer like this does not feel right,
// but I cant think of another way...
var ageCalculator = container.Resolve<IAgeCalculator>("Days");
var personInitializer = new InjectionMethod("Initializer", ageCalculator);
container.RegisterType<IPerson, Person>(personInitializer);
var person1 = Factory<IPerson>.Create(container);
person1.Name = "Jacob";
person1.Gender = "Male";
person1.Birthday = new DateTime(1995, 4, 1);
var person2 = Factory<IPerson>.Create(container);
person2.Name = "Emily";
person2.Gender = "Female";
person2.Birthday = new DateTime(1998, 10, 31);
}
Here are my class definitions:
public interface IAgeCalculator
{
string GetAge(IPerson person);
}
internal class AgeInYearsCalculator : IAgeCalculator
{
public string GetAge(IPerson person) {
var years = DateTime.Now.Subtract(person.Birthday).TotalDays / 365;
return years.ToString("0.00") + " years";
}
}
internal class AgeInDaysCalculator : IAgeCalculator
{
public string GetAge(IPerson person) {
var days = (DateTime.Now.Date - person.Birthday).TotalDays;
return days.ToString("#,#") + " days";
}
}
public interface IPerson
{
string Name { get; set; }
string Gender { get; set; }
DateTime Birthday { get; set; }
string Age { get; }
}
public class Person : IPerson
{
private IAgeCalculator _ageCalculator;
public void Initializer(IAgeCalculator ageCalculator) {
_ageCalculator = ageCalculator;
}
public string Name { get; set; }
public string Gender { get; set; }
public DateTime Birthday { get; set; }
public string Age => _ageCalculator.GetAge(this);
}
public class Factory<T>
{
public static T Create(IUnityContainer container) {
return container.Resolve<T>();
}
}
Is there a better way?
Register IAgeCalculator
using RegisterInstance<T>
(not RegisterType<T>
) and pass in an instance derived from that type.
static void Main(string[] args)
{
IUnityContainer container = new UnityContainer();
container.RegisterInstance<IAgeCalculator>("Years", new AgeInYearsCalculator());
container.RegisterInstance<IAgeCalculator>("Days", new AgeInDaysCalculator());
container.RegisterType<IPerson, Person>();
var person1 = Factory<IPerson>.Create(container);
person1.Name = "Jacob";
person1.Gender = "Male";
person1.Birthday = new DateTime(1995, 4, 1);
var person2 = Factory<IPerson>.Create(container);
person2.Name = "Emily";
person2.Gender = "Female";
person2.Birthday = new DateTime(1998, 10, 31);
}
Then in your Person
class, mark AgeCalculator
with the [Dependency]
attribute.
public class Person : IPerson
{
[Dependency("Days")]
public IAgeCalculator AgeCalculator { get; set; }
public string Name { get; set; }
public string Gender { get; set; }
public DateTime Birthday { get; set; }
public string Age => AgeCalculator.GetAge(this);
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加