Я создаю приложение в ASP.NET MVC 4. Я создаю класс (похожий на тип Factory), который вернет мне экземпляр моих классов обслуживания, которые я сделал в BAL Layer. Я хочу объявить статические свойства в этом классе, и они должны вернуть экземпляр запрошенного класса обслуживания.
Мой вопрос в том, что возможно, что статическое свойство вернет экземпляр нового класса, потому что статическому свойству будет выделена память, которая останется во всем приложении. Я немного запутался здесь. Пожалуйста, объясните, что происходит, и что это лучший способ сделать это.
Код, сделанный до сих пор
public class Factory
{
public static CountryService CountryServiceInstance
{
get
{
return new CountryService(new CountryRepository());
}
}
}
То, что вы должны сделать, это написать функцию, которая создаст новые экземпляры, а не свойство get
public class Factory
{
public static CountryService CreateNewService()
{
return new CountryService(new CountryRepository());
}
}
О вашей памяти относятся к чтению Шрирама Сактивеля
Подробнее о шаблоне Factory здесь: http://msdn.microsoft.com/en-us/library/ee817667.aspx
Свойство в С# - это просто метод, который возвращает то, что он должен возвращать в своем теле. В вашем случае каждый раз, когда вы обращаетесь к этому свойству, будет создан новый экземпляр службы.
Если вам нужен только один экземпляр этой службы, вы можете захотеть сохранить ее в статической частной переменной, подобной этой
private static readonly Lazy<CountryRepository> _fact
= new Lazy<CountryRepository>(() => new CountryRepository());
Кроме того, статическое свойство никогда не хранит что-либо "в памяти во всем приложении", но программист может это сделать.
И снова свойство - это всего лишь пара методов set\get, если вы не используете автоматическое свойство, где также есть поле поддержки, созданное для хранения значения.
static
ключевое слово само указывает только, что к текущему члену класса не нужно обращаться, хотя this
ключевое слово, и его значение будет передаваться по всему домену appdomain (или вашему приложению).
static public readonly
переменные, доступные только для чтения, видимые отовсюду, то простое чтение переменной по ссылке не будет проблемой производительности для вашего случая.
ваш метод CountryServiceInstance для каждого вызова всегда даст вам новый экземпляр CountryRepository.
Как вы уже упоминали, большинство классов Factory являются статическими, которые отвечают за создание новых экземпляров объектов. Если они дают один и тот же экземпляр объекта, ни один из заводских шаблонов не будет служить его намерению.
вы, несомненно, можете продолжить свой грех.
если вы хотите быстро проверить, вы можете проверить созданные объекты hashcode object.GetHashCode(), они будут уникальными, поскольку они являются отдельными объектами