我正在ASP.NET MVC 4中构建一个应用程序。我正在创建一个类(类似于Factory类型),它将返回我在BAL Layer中创建的服务类的实例。我想在该类中声明静态属性,它们应该返回所请求的服务类的实例。
我的问题是,静态属性可能会返回新类的实例,因为静态属性将被分配一个将保留在整个应用程序中的内存。我在这里有点困惑,请解释发生了什么以及最好的方法。
到目前为止完成的代码
public class Factory
{
public static CountryService CountryServiceInstance
{
get
{
return new CountryService(new CountryRepository());
}
}
}
答案 0 :(得分:3)
你应该做的是编写一个函数,它将创建新实例而不是get属性
public class Factory
{
public static CountryService CreateNewService()
{
return new CountryService(new CountryRepository());
}
}
关于你的记忆关注阅读Sriram Sakthivel的第一条评论 更多关于工厂模式的信息: http://msdn.microsoft.com/en-us/library/ee817667.aspx
答案 1 :(得分:2)
C#中的属性只是一个返回它应该在其体内返回的方法。在您的情况下,每次访问该属性时,都将创建一个新的服务实例。
如果您只想要该服务的一个实例,您可能希望将其存储到静态私有变量中,如下所示
private static readonly Lazy<CountryRepository> _fact
= new Lazy<CountryRepository>(() => new CountryRepository());
此外,静态属性永远不会在整个应用程序中存储“内存”,但程序员可以这样做。
再一次,属性只是一对set \ get方法,除非你使用自动属性,其中还有一个为要存储的值创建的支持字段。
static
关键字本身仅指定不能通过this
关键字访问当前的类成员,并且它的值将在整个appdomain(或您的应用程序)中共享。
答案 2 :(得分:1)
您的方法每次调用的CountryServiceInstance将始终为您提供CountryRepository的新实例。
正如您所提到的,大多数Factory类都是静态的,负责创建新的对象实例。如果它们给出相同的对象实例,则任何工厂模式都不会满足其意图。
你可以毫无疑问地继续处理你的罪行。如果要快速验证,可以检查创建的对象哈希码 object.GetHashCode()它们将是唯一的,因为它们是单独的对象